Bash:自定义排序/对每个ID组,将某行移到组的顶部

Bash: Custom sort / for each ID group, move a certain line to top of group

我有一个8列的文件,前两列是ID。第一列中的 ID 最多重复 12 次 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(,a,"_"); print (~a[n]) "\t" [=10=]}' | 
  sort -k2,2 -k1,1r -s | cut -f2-