我有一个这样的示例文件:
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
答案 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