如何选择行中负数之和等于或小于-3(带awk)的行?
我有这样一个示例文件:如何选择行中负数之和等于或小于-3(带awk)的行?,awk,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
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
我没有收到任何错误,但是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
如何确保第一个行头也在输出文件中?
所以我想把这个放出来:
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
试试这个:
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。请尝试以下操作:
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。您所描述的内容可以更容易地使用正确的格式进行编码。并不是说我总是在编写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
您所描述的内容可以更容易地使用正确的格式进行编码。并不是说我总是在编写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