Выберите столбцы, в которых значение встречается более x раз

Depends: init-system-helpers (>= 1.13~)

означает, что для rabbitmq-serverтребуется init-system-helper1.13 или более поздняя версия , поэтому версия по умолчанию в любом поддерживаемом выпуске Ubuntu должна удовлетворять зависимости. Просто беги

sudo apt-get install init-system-helpers

Однако вы все еще используете Ubuntu 12.04, в которой нет init-system-helpers. Вам необходимо перейти на поддерживаемую версию Ubuntu.

4
11.09.2019, 13:17
2 ответа
BEGIN { OFS = FS = "\t" }

FNR == NR {
        for (i = 2; i <= NF; ++i)
                if ($i == 2) ++c[i]
        next
}

{
        a[nf=1] = $1
        for (i = 2; i <= NF; ++i)
                if (c[i] >= t) a[++nf] = $i

        $0 = ""
        for (i = 1; i <= nf; ++i)
                $i = a[i]

        print
}

Эта awkпрограмма будет подсчитывать количество вхождений значения 2в каждом столбце и сохранять эти значения в массивеc(по одному элементу в этом массиве на столбец данных ). Он делает это при чтении входного файла в первый раз (это блок FNR == NR).

При повторном чтении входного файла он использует эти счетчики для переноса соответствующих столбцов из ввода в массив aдля каждой прочитанной строки. Значение переменной tиспользуется в качестве порогового значения для принятия решения о том, следует ли включать столбец или нет. Это первый цикл forв последнем блоке кода.

Затем он создает новую запись данных из этого массива и распечатывает ее.

Тестирование (обратите внимание, что входной файл задается дважды в командной строке, awkчтобы можно было выполнить два прохода над ним):

$ cat file
Individuals     M1      M2      M3
Ind1    0       0       2
Ind2    0       2       2
Ind3    2       2       2
$ awk -v t=1 -f script.awk file file
Individuals     M1      M2      M3
Ind1    0       0       2
Ind2    0       2       2
Ind3    2       2       2
$ awk -v t=2 -f script.awk file file
Individuals     M2      M3
Ind1    0       2
Ind2    2       2
Ind3    2       2
$ awk -v t=3 -f script.awk file file
Individuals     M3
Ind1    2
Ind2    2
Ind3    2
$ awk -v t=4 -f script.awk file file
Individuals
Ind1
Ind2
Ind3
1
27.01.2020, 20:59

Не уверен, что это быстро:

awk -v value=0 '
NR==FNR{for(i=2;i<=NF;i++){if($i==value){s[i]++}}}
NR!=FNR {
  printf "%s"OFS,$1
  for (i=2;i<=NF;i++){if(s[i]>1)last=i}
  for (i=2;i<=NF;i++){
    if(s[i]>1){
      if (i==last)printf "%s\n",$i
      else printf "%s"OFS,$i}
  }
}
' file file

Возможно, вы захотите установить OFSна вкладку(BEGIN{OFS="\t"}.)

1
27.01.2020, 20:59

Теги

Похожие вопросы