Bash:customsort/对于每个ID组,将某一行移动到组的顶部

Bash:customsort/对于每个ID组,将某一行移动到组的顶部,bash,sorting,unix,match,move,Bash,Sorting,Unix,Match,Move,我有一个8列文件,前两列是id。第一列中的ID最多重复12次。我需要按第一列ID进行迭代,当我找到col1=col2的行时,我需要将这一行移到该ID组的顶部。一个复杂的情况是匹配的部分只是第1列ID和第2列ID的一部分。文件已排序。以下是输入的示例: aac(3)-IIa_1_X51534 lcl|JQ364967.1_cds_AFI72859.1_82 99.768 aac(3)-IIa_1_X51534 lcl|X51534.1_cds_CAA35913.1_

我有一个8列文件,前两列是id。第一列中的ID最多重复12次。我需要按第一列ID进行迭代,当我找到col1=col2的行时,我需要将这一行移到该ID组的顶部。一个复杂的情况是匹配的部分只是第1列ID和第2列ID的一部分。文件已排序。以下是输入的示例:

aac(3)-IIa_1_X51534     lcl|JQ364967.1_cds_AFI72859.1_82        99.768 
aac(3)-IIa_1_X51534     lcl|X51534.1_cds_CAA35913.1_1   100.000    
aac(3)-IIa_1_X51534     lcl|EU022315.1_cds_ABS70978.1_1 99.535 
aac(6')-33_1_GQ337064   lcl|GQ337064.1_cds_ACT99625.1_2 100.000 
aac(6')-33_1_GQ337064   lcl|JN596280.1_cds_AEZ05106.1_2 100.000 
aac(6')-aph(2'')_1_M13771       lcl|CP000029.1_cds_AAW54933.1_1550   100.000
aac(6')-aph(2'')_1_M13771       lcl|M13771.1_cds_AAA26865.1_1   100.000 
aac(6')-aph(2'')_1_M13771       lcl|FN433596.1_cds_CBI49941.1_2062      99.931
所需的输出将是:

aac(3)-IIa_1_X51534     lcl|X51534.1_cds_CAA35913.1_1   100.000       
aac(3)-IIa_1_X51534     lcl|JQ364967.1_cds_AFI72859.1_82        99.768 
aac(3)-IIa_1_X51534     lcl|EU022315.1_cds_ABS70978.1_1 99.535 
aac(6')-33_1_GQ337064   lcl|GQ337064.1_cds_ACT99625.1_2 100.000 
aac(6')-33_1_GQ337064   lcl|JN596280.1_cds_AEZ05106.1_2 100.000 
aac(6')-aph(2'')_1_M13771       lcl|M13771.1_cds_AAA26865.1_1   100.000 
aac(6')-aph(2'')_1_M13771       lcl|CP000029.1_cds_AAW54933.1_1550   100.000
aac(6')-aph(2'')_1_M13771       lcl|FN433596.1_cds_CBI49941.1_2062      99.931

我将匹配行(在第一行中,是X51534)移动到组的顶部。(虽然这并不总是小组中的第二行。)我可以使用Perl,也可以使用Bash(通过几个循环)。然而,我认为应该有一个简洁的解决方案(也许使用awk)?我已经尝试了许多使用关联数组的awk解决方案,但由于某些原因,我无法破解它。我有一个习惯,就是让我的程序过于复杂。有什么提示吗?

awk
救命

$ awk '{n=split($1,a,"_"); print ($2~a[n]) "\t" $0}' | 
  sort -k2,2 -k1,1r -s | cut -f2-

awk
救援

$ awk '{n=split($1,a,"_"); print ($2~a[n]) "\t" $0}' | 
  sort -k2,2 -k1,1r -s | cut -f2-

你们能编辑这个问题来展示你们的作品吗?我的脚本大约有10行,并没有达到最终目标,所以我认为这会不必要地延长文章的篇幅。因为下面的awk评论回答了我的问题,所以我不会编辑这篇文章。我知道必须有一个awk解决方案,但我想不出来。很抱歉,我一开始无法添加更多!你们能编辑这个问题来展示你们的作品吗?我的脚本大约有10行,并没有达到最终目标,所以我认为这会不必要地延长文章的篇幅。因为下面的awk评论回答了我的问题,所以我不会编辑这篇文章。我知道必须有一个awk解决方案,但我想不出来。很抱歉,我一开始无法添加更多!哇,太酷了!我分别运行每个命令以了解它们都做了什么。正如我所说,我喜欢把事情复杂化——我有一个很长的脚本,但我只知道有一个更简单的方法来处理awk!我知道所有这些命令,但我没想到会这样把它们组合在一起。这就是我喜欢写代码的原因!非常感谢,这是一次很棒的学习经历,它将帮助我编写更高效的代码。哇,这太酷了!我分别运行每个命令以了解它们都做了什么。正如我所说,我喜欢把事情复杂化——我有一个很长的脚本,但我只知道有一个更简单的方法来处理awk!我知道所有这些命令,但我没想到会这样把它们组合在一起。这就是我喜欢写代码的原因!非常感谢,这是一次很棒的学习经历,它将帮助我编写更高效的代码。