Как выбрать строки, в которых сумма отрицательных чисел в строке равна или меньше -3 (с помощью awk)? - PullRequest
1 голос
/ 21 февраля 2012

У меня есть образец файла, подобный этому:

probeset_id submitted_id chr snp_pos alleleA alleleB 562_201 562_202 562_203 562_204 562_205 562_206 562_207 562_208 562_209 562_210  
AX-75448119 Chr1_41908741 1 41908741 T C 0 -1 0 -1 0 0 0 0 0 -1 
AX-75448118 Chr1_41908545 1 41908545 T A 2 -1 2 2 2 -1 -1 2 2 0
AX-75448118 Chr1_41908545 1 41908545 T A 1 2 -1 2 2 -1 2 -1 2 0 

и я хочу исключить строки, у которых сумма отрицательных чисел равна или меньше -3, я знаю, как рассчитать сумму отрицательных чисел и распечатать ее, с помощью этого кода:

awk 'BEGIN{sum=0} NR >=2 {for (i=7;i<=NF;i++) if ($i ~ /^-/) sum += $i; print $1,$2,$3,$4,$5,$6,sum; sum=0}' test.txt > out.txt

Но я не хочу этого делать, я просто хочу вычислить сумму отрицательного числа, а затем выбрать строки, которые меньше или равны -3.

Это команды, которые я написал:

awk 'BEGIN{sum=0} NR >=2 {for (i=7;i<=NF;i++) if ($i ~ /^-/) sum += $i;  sum=0}' test.txt | awk 'sum <= -3' > out.txt

Я не получаю ошибок, но файл out.txt пуст!

awk 'BEGIN{sum=0} NR >=2 {for (i=7;i<=NF;i++) if ($i ~ /^-/) sum += $i; if sum >= -3 pritn R; sum=0}' test.txt | wc -l

который я получаю:

^ syntax error

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

probeset_id submitted_id chr snp_pos alleleA alleleB 562_201 562_202 562_203 562_204 562_205 562_206 562_207 562_208 562_209 562_210  
    AX-75448119 Chr1_41908741 1 41908741 T C 0 -1 0 -1 0 0 0 0 0 -1 
    AX-75448118 Chr1_41908545 1 41908545 T A 2 -1 2 2 2 -1 -1 2 2 0

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

То, что вы описали, легче кодировать при правильном форматировании.(Не то чтобы я всегда прибегал к использованию редактора при написании сценариев awk ...)

Первое условие (NR == 1) просто гарантирует, что мы напечатаем первую строку как есть.

awk '
NR == 1 { print }
NR >= 2 {
    sum = 0;
    for (i=7;i<=NF;i++) {
        if ($i < 0)
            sum += $i;
    }
    if (sum <= -3)
        print;
}
' test.txt > out.txt
2 голосов
/ 21 февраля 2012

Попробуйте это:

awk '
  NR == 1 { 
    print 
    next 
  } 
  { 
    negsum=0 
    for(i=7; i<=NF; i++) { 
      if ($i<0) {
        negsum += $i 
      } 
  } 
  negsum <= -3'

Ваша первая попытка не удалась, потому что вы используете два разных вызова awk.Это две разные программы, которые выполняются, и вторая ничего не знает о переменной sum в первой, поэтому она использует значение по умолчанию sum = 0.

Вторая попытка просто неправильно написана.Вы использовали pritn вместо print.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...