结合awk脚本的问题

时间:2015-07-12 06:22:55

标签: linux bash awk

我正在尝试使用awk来解析制表符分隔表 - 第一列中有几个重复的条目,我需要删除表中其他4列总和较小的重复行。我可以轻松地删除第一行或第二行,并对列进行求和,但我在将两者结合时遇到了麻烦。为了我的目的,永远不会超过2个重复。

示例文件:http://pastebin.com/u2GBnm2D

在这种情况下,所需的输出是删除行:

lmo0330 1       1       0       1
lmo0506 7       21      2       10

并保持列中具有相同基因id的其他两行。最终解析的文件如下所示:http://pastebin.com/WgDkm5ui

这是我尝试过的(这没有做任何事情。但第一部分删除了第二部分,第二部分总结了计数):

awk 'BEGIN {!a[$1]++} {for(i=1;i<=NF;i++) t+=$i; print t; t=0}'

我尝试在这个问题的最佳答案中修改脚本的第二部分:Removing lines containing a unique first field with awk?

awk 'FNR==NR{a[$1]++;next}(a[$1] > 1)' ./infile ./infile

但不幸的是,我并不真正了解它的发展情况。谁能帮我吗?我想我需要用[删除]替换a[$1] > 1部分(第一次重复计数或第二次重复计数,具体取决于哪个更大)。

编辑:如果重要的话,我也在使用GNU Awk 3.1.7。

1 个答案:

答案 0 :(得分:3)

您可以使用此awk命令:

awk 'NR == 1 {
   print;
   next
} {
   s = $2+$3+$4+$5
} s >= sum[$1] {
   sum[$1] = s;
   if (!($1 in rows))
      a[++n] = $1;
   rows[$1] = $0
} END {
   for(i=1; i<=n; i++)
      print rows[a[i]]
}' file | column -t

<强>输出:

gene     SRR034450.out.rpkm_0  SRR034451.out.rpkm_0  SRR034452.out.rpkm_0  SRR034453.out.rpkm_0
lmo0001  160                   323                   533                   293
lmo0002  135                   317                   504                   306
lmo0003  1                     4                     5                     3
lmo0004  35                    59                    58                    48
lmo0005  113                   218                   257                   187
lmo0006  279                   519                   653                   539
lmo0007  563                   1053                  1165                  1069
lmo0008  34                    84                    203                   107
lmo0009  13                    45                    90                    49
lmo0010  57                    210                   237                   169
lmo0011  65                    224                   247                   179
lmo0012  65                    226                   250                   215
lmo0013  342                   500                   738                   682
lmo0014  662                   1032                  1283                  1311
lmo0015  321                   413                   631                   637
lmo0016  175                   253                   273                   325
lmo0017  3                     6                     6                     6
lmo0018  33                    38                    46                    45
lmo0019  13                    1                     39                    1
lmo0020  3                     12                    28                    15
lmo0021  3                     4                     14                    12
lmo0022  2                     3                     5                     1
lmo0023  2                     0                     3                     2
lmo0024  1                     0                     2                     6
lmo0330  1                     1                     1                     3
lmo0506  151                   232                   60                    204