嗨我有这样的文件:
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 2 2 2 -1 2 2 2 0
我想从第7列到第7列计算负数字的总和(在实际文件中我有102列):
我使用awk
来计算正常总和(并且它完美地运行):
awk 'NR>1 {x+=$8}END{print x}' test.txt
但我想要做的是仅计算负数的总和。如果没有负面意义,我希望0
。
所以我想找到一个我为每一列运行的awk命令,我得到0
的输出或负数,例如-1 -2 -3
等等。
这就是我的尝试:
awk '/^-/ {n++;x+=$9} END {print x}' test.txt
awk '/^-/ {x+=$9} END {print x}' test.txt
awk 'NR>1' test.txt | awk '/^-/ {x+=$9} END {print x}'
但我一无所获!没有错误,现在回答! 我也试图获得理想的输出格式:
562_201 562_202 562_203 562_204 562_205 562_206 562_207 562_208 562_209 562_210
0 -2 0 -1 0 -2 -1 0 0 -1
我尝试了几件我认为基本上错了的事情:
awk 'NR>1 {for ($i=7;i<=NF;$i++) if (x ~ /^-/) x+=$i }END{print x}' test.txt
结果:我的电脑换了!
awk 'NR>1 {for (i=7;i<=NF;i++) if ($i ~ /^-/) x+=$i }END{print x}' test.txt
结果:我得到一个不相关的答案(文件中负数的总和)!
但这并不重要。我只想让awk
命令计算每列中负数的总和!
答案 0 :(得分:1)
你必须更加努力,你发布的最后一个例子非常接近。这将分别对列进行求和(如果这是您想要的):
awk 'NR == 1 {cols = NF-7; for (i=7;i<=NF;i++) {header[i-7]=$i; x[i-7]=0;} }
NR>1 {for (i=7;i<=NF;i++) if ($i ~ /^-/) x[i-7]+=$i }
END{for(i=0; i<=cols; i++) print header[i], x[i]}' <file