如何选择行中负数之和等于或小于-3(用awk)的行?

时间:2012-02-21 10:44:55

标签: awk

我有一个这样的示例文件:

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 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分:2)

您所描述的内容可以通过正确的格式更容易编码。 (并不是说在编写脚本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