我正在尝试使用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
部分(第一次重复计数或第二次重复计数,具体取决于哪个更大)。
答案 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