У меня есть файл, который имеет числовые значения в виде матрицы. Я написал скрипт awk, который печатает заголовок, а затем добавляет 1 к столбцу «сумма», если значения в столбцах меньше 5 и больше 0. Затем, в конце, он печатает сумму каждого столбца. Эта часть отлично работает:

awk '
  BEGIN {FS=OFS=" "}
  NR==1 {print}
  NR>1  {for (i=1;i<=NF;i++) if ($i < 5 && $i > 0) a[i]+=1}
  END   {for (i=1;i<=NF;i++) printf $a[i]
}' snp_fake2.txt > tmp.txt`

Моя цель - напечатать весь столбец, если сумма этих столбцов больше некоторого значения THRESHOLD. Я попытался добавить оператор if после второго цикла for, чтобы определить, является ли сумма столбцов a [i]> THRESHOLD, и затем напечатать столбец:

awk '
  BEGIN {FS=OFS=" "}
  NR==1 {print}
  NR>1  {for (i=1;i<=NF;i++) if ($i < 5 && $i > 0) a[i]+=1}
  END   {for (i=1;i<=NF;i++) if (a[i] < THRESHOLD) printf $i
}' snp_fake2.txt > tmp.txt`

Но когда я запускаю это, скрипт не выводит весь столбец, только одно число. Как я могу напечатать весь столбец вместо одного значения?

2 ответа2

0

Если я правильно понял, одним из способов является использование двумерного массива. Работает с GNU awk.

echo -e '1 4 7\n2 5 8\n3 6 9' | awk '
{ for (i=1;i<=NF;i++) {
        field[i][NR]=$i
        if ($i < 5 && $i > 0) {
            a[i]+=1
            }
        }
}
END {
    for (i in a) {
        if (a[i] > 2) {
            for (j in field[i]) print field[i][j]
            }
        }
}'
0

AWK обрабатывает файл по одной строке за раз. У него нет памяти о предыдущих строках. Правило END выполняется после обработки последней строки. На этом этапе AWK не может распечатать все записи в столбце $ i, поскольку ему известно только одно значение для столбца $ i: значение из последней строки.

Ваша цель требует два прохода файла: один для расчета суммы столбцов, а второй - для печати всего столбца (для соответствующих столбцов). Для этого вы можете написать сценарий оболочки, который вызывает awk для вычисления сумм, а затем вызывает awk (или что-то еще) для печати столбцов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .