linux – 结合awk脚本的问题
发布时间:2020-12-13 22:57:59 所属栏目:Linux 来源:网络整理
导读:我试图使用awk来解析制表符分隔表 – 第一列中有几个重复的条目,我需要删除表中其他4列总和较小的重复行.我可以轻松地删除第一行或第二行,并对列进行求和,但我在将两者结合时遇到了麻烦.为了我的目的,永远不会超过2个重复. 示例文件:http://pastebin.com/u2
我试图使用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 但不幸的是,我并不真正了解它的发展情况.谁能帮我吗?我想我需要更换一个[$1]> 1部分[删除(第一次重复计数或第二次重复计数,具体取决于哪个更大). 编辑:如果重要的话,我也在使用GNU Awk 3.1.7. 解决方法
你可以使用这个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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |