Awk 查找值相等的行,比较它们的列并删除较小的值';s线

Awk 查找值相等的行,比较它们的列并删除较小的值';s线,awk,sed,editing,Awk,Sed,Editing,我有以下代码行: 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

我有以下代码行:

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中删除这些行,而不仅仅是打印要删除的行。抱歉造成混淆。

这将相互比较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

您是将GO值相互比较,还是将GO值与$2进行比较?将GO值与$2进行比较。我想比较$2中所有具有相同值的行。所以在我的示例中,我会比较第1行和第2行,因为它们的$2值都是213。然后比较这些行的GO值,并从biallelic.output中删除第二行,因为1037>1。为了清楚起见,请将第二行的GO值更改为137。但是,您并不是真正删除任何记录,而是报告需要执行的操作。我猜你想要一个删除了这些记录的文件,不是吗?我真的想删除那些行,这是我造成混乱的原因。问题已被编辑。这很有效,谢谢。是否可以将$1中的行号通过管道传输到sed中,以将其从原始文件中删除?类似于
sed'{}d'
的东西,如果这有意义的话。我不确定我是否理解。第二个脚本为您提供了一个过滤掉不需要的记录的输出。是否要删除第一个字段(
$1
)?如果是这样,请打印$2、$3、$4,而不是打印
print
。第一个字段只是bialelic.output中的行号。如果删除
并再次运行它,然后打印$1,结果将是我希望从原始biallelic.output中删除的行。我没有发布biallelic.output的全部内容,因为大部分内容没有被修改。