删除总和为零的行

删除总和为零的行

如果所有列中的值均为 0(因此,如果行的总和为 0),我需要删除文件中的所有行。

我的文件是这样的(13列和60000行,制表符分隔)

KO  gene    S10 S11 S12 S1  S2  S3  S4  S5  S6  S7  S8  S9
K02946  aap:NT05HA_2163 0   0   0   0   1   0   8   0   0   5   0   0
K06215  aar:Acear_1499  0   0   0   0   0   0   8   0   0   0   0   0
K00059  acd:AOLE_11635  0   0   5   0   0   0   0   0   8   0   0   0
K00991  afn:Acfer_0744  0   0   0   0   0   0   0   0   0   0   0   0
K01784  aha:AHA_2893    0   0   0   0   0   0   7   0   0   0   0   0
K01497  amd:AMED_3340   0   0   0   0   0   0   0   0   0   0   0   0

我能怎么做?

答案1

如果您想要awk解决方案:

awk '{s=0; for (i=3;i<=NF;i++) s+=$i; if (s!=0)print}' infile > outfile

如果您想保留第一行作为第二行的标题开始脚本:

awk 'NR > 1{s=0; for (i=3;i<=NF;i++) s+=$i; if (s!=0)print}' infile > outfile

答案2

如果您的列仅包含非负数,则只需打印行至少有一个数字大于 0 的字段。

perl

$ perl -MList::Util=first -anle '
  print if first {$_ > 0} @F or $. == 1;
' file
KO  gene    S10 S11 S12 S1  S2  S3  S4  S5  S6  S7  S8  S9
K02946  aap:NT05HA_2163 0   0   0   0   1   0   8   0   0   5   0   0
K06215  aar:Acear_1499  0   0   0   0   0   0   8   0   0   0   0   0
K00059  acd:AOLE_11635  0   0   5   0   0   0   0   0   8   0   0   0
K01784  aha:AHA_2893    0   0   0   0   0   0   7   0   0   0   0   0

你应该阅读这个问题如果使用解决方案,出于安全原因perl

awk

$ awk 'FNR == 1{print;next}{for(i=3;i<=NF;i++) if($i > 0){print;next}}' file

相关内容