查找具有相等值的行,比较其列并删除较小值的行

问题描述 投票:0回答:1

我有以下代码行:

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

它输出:

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>$2}'我能够根据第二列中的值分隔行,但我试图避免将结果写入文件。

我错过了什么?

编辑:我实际上是试图从biallelic.output中删除这些行,而不仅仅是打印我要删除的行。对困惑感到抱歉。

awk sed editing
1个回答
1
投票

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

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

Lines Removed From biallelic.output
2462
2464
2465
2146
2463

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

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

获得过滤后的输出

$ sed 's/GO=/& /' file | 
  sort -k2,2 -k5n      | 
  awk '!a[$2]++ {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
© www.soinside.com 2019 - 2024. All rights reserved.