查找具有相同值的行,比较它们的列并删除较小值的行

Finding Rows with Equal Values, Comparing their Columns and Removing the Smaller Value's Line

我有下面一行代码:

grep -nP ';MULTIALLELIC' biallelic.output | sort -k2 | awk -F'[:;\t]' '{print ,,,}'

它输出:

2374 213 MID=212 GO=1
2462 213 MID=477 GO=137
2394 233 MID=232 GO=1
2464 233 MID=668 GO=1070
2185 24 MID=23 GO=1
2465 24 MID=752 GO=1083
2146 48 MID=354 GO=1010
1893 48 MID=47 GO=1
2219 58 MID=57 GO=1
2463 58 MID=595 GO=1057

我需要根据第二列中找到的值比较 GO 值。无论哪一行具有较大的 GO 值,我都想从原始文件中删除该行号。


通过添加 awk '{print>}' 我可以根据第二列中的值分隔行,但我试图避免将结果写入文件。

我错过了什么?

编辑:我实际上是在尝试从 biallelic.output 中删除这些行,而不仅仅是打印我想删除的行。抱歉造成混淆。

这将相互比较 GO 值并列出与最小值相比具有更高值的记录。

$ sed 's/GO=/& /' file | 
  sort -k2,2 -k5n      | 
  awk 'a[]++{if(!h) print h="Lines Removed From biallelic.output";
               print }'

Lines Removed From biallelic.output
2462
2464
2465
2146
2463

header 如果没有报告值,将有条件地打印。

拆分最后一个字段以将数字与前缀分开进行排序,按第二个字段对值进行分组并按数字对 GO 值进行排序。每组第一个是最小值,报告除第一个之外的所有组。

得到过滤后的输出

$ sed 's/GO=/& /' file | 
  sort -k2,2 -k5n      | 
  awk '!a[]++ {sub(/GO= /,"GO="); print}'

2374 213 MID=212 GO=1
2394 233 MID=232 GO=1
2185 24 MID=23 GO=1
1893 48 MID=47 GO=1
2219 58 MID=57 GO=1