Regex 在几行中对一些未排序的内容进行Grep和排序(在一个文档中)

Regex 在几行中对一些未排序的内容进行Grep和排序(在一个文档中),regex,list,sorting,grep,Regex,List,Sorting,Grep,我有一个文件,在一行中有几个未排序的东西,我想把它们放入一个新文件中 这是我拥有的部分文件的一个示例: X1314448: SaMi|SM_g2554.t1 SaMi|SM_g5072.t1 Des|Des_g3808.t1 Dul|Dul_comp50786_c0_seq1-1 Nig|Nig_comp88811_c0_seq2-1 AB|AB0003DMP400018076_AB0003DMT400026495 Phy|Phy_comp35647_c0_seq1-1 SWtf|SW_g278

我有一个文件,在一行中有几个未排序的东西,我想把它们放入一个新文件中

这是我拥有的部分文件的一个示例:

X1314448: SaMi|SM_g2554.t1 SaMi|SM_g5072.t1 Des|Des_g3808.t1 Dul|Dul_comp50786_c0_seq1-1 Nig|Nig_comp88811_c0_seq2-1 AB|AB0003DMP400018076_AB0003DMT400026495 Phy|Phy_comp35647_c0_seq1-1 SWtf|SW_g27807.t1 Tom|Solyc02g077050.2.1
X1314810: Des|Des_g33587.t1 Nig|Nig_comp84357_c0_seq1-1 AB|AB0003DMP400020961_AB0003DMT400030857 Phy|Phy_comp33112_c0_seq1-1 SaMi|SM_g27352.t1 SWtf|SW_g21774.t1 TAIR|AT4G14930.1 Tom|Solyc06g054250.2.1 Dul|Dul_comp63657_c0_seq2-1
X1327159: AB|AB0003DMP400016823_AB0003DMT400024599 AB|AB0003DMP400017933_AB0003DMT400026257 Dul|Dul_comp58749_c0_seq2-1

X1330513: Des|Des_g36886.t1 AB|AB0003DMP400049952_AB0003DMT400073802 SWtf|SW_g16502.t1

X132738: Des|Des_g491.t1 Des|Des_g6171.t1 Dul|Dul_comp57659_c0_seq2-1 Dul|Dul_comp57659_c0_seq3-1 Dul|Dul_comp57659_c0_seq4-1 Ni                                                                       g|Nig_comp93106_c3_seq1-1 Nig|Nig_comp93106_c3_seq2-1 AB|AB0003DMP400005485_AB0003DMT400007895 AB|AB0003DMP400021388_PGS                                                                       C0003DMT400031553 Phy|Phy_comp61931_c0_seq1-1 Phy|Phy_comp61931_c0_seq2-1 Phy|Phy_comp61931_c0_seq3-1 Phy|Phy_comp61931_c0_seq4-1                                                                        RICE|LOC_Os08g43334.1 RICE|LOC_Os08g43334.2 RICE|LOC_Os09g35790.1 RICE|LOC_Os09g35790.2 SaMi|SM_g30888.t1 SaMi|SM_g5888.t1 SWtf|SW                                                                       _g17547.t1 SWtf|SW_g33717.t1 Des|Des_g47565.t1 SaMi|SM_g6027.t1 SWtf|SW_g42019.t1 TAIR|AT5G62020.1 Tom|Solyc03g026020.2.1 TAIR|AT4                                                                       G11660.1
我想要的是第一部分“X1314448:”后接“Des | Des | Des | Des | Des | g3808.t1”。如果还有另一个“Des | xxx”(在某些情况下有不止一个,就像在倒数第二行中一样),我希望也包括这个部分,然后是“AB | AB00…”在输出文件中,但由于它是一个未排序的列表,我不确定如何在保持它们在同一行(保持它们相互链接)的同时对我想要的三个不同部分进行排序。我也不确定如何在这样的一行上获得多个匹配项

因此,对于第一行,输出应为:

X1314448: Des|Des_g3808.t1 AB|AB0003DMP400018076_AB0003DMT400026495 
对于第二个到最后一个:

X1330513: Des|Des_g36886.t1 AB|AB0003DMP400049952_AB0003DMT400073802
最后一点:

X132738: Des|Des_g491.t1 Des|Des_g6171.t1 Des|Des_g47565.t1 AB|AB0003DMP400005485_AB0003DMT400007895 AB|AB0003DMP400021388_PGSC0003DMT400031553
我认为主要的问题是最后一行。我还希望能够修改文件以 也包括“Dul |……”

我尝试过几种方法,最后一行似乎使使用pipes和grep变得不可能,尽管我不确定,因为我已经看到使用这种方法做了一些伟大的事情。我对Perl有一些经验,但不知道如何使用它来解决这个问题。我也尝试过使用awk,这可能是解决这个问题的最佳方法,但我知道我也没有使用它的有效解决方案

对于如何解决此问题,我非常感激。

script.awk的内容
我不明白,请你添加一些解释,以便我知道足够的信息,以便稍后能够将其应用于一些稍有不同的文件?@user2478002更新了注释。谢谢,这改进了很多,尽管最后一行仍然存在问题(它没有排序,我希望所有的“Des | D…”都跟随X…).知道如何排序吗?我想做的另一件事是制作另一个文件,其中有“Dul”。。。“也包括在内,我如何编辑此代码以包含它?@Stenemo更新了解决方案,首先保留
Des
条目。对于
Dul
,可以重用现有脚本并更改
if循环。如果您遇到任何问题,您可以随时发布另一个问题。+1感谢您的出色努力
# Ignore blank lines we put a condition NF which means only perform
# action on lines that are not blank

NF {

# Initialize variables

    x=y=""

# We print the fist column along with the FS variable which is blank by default

    printf "%s", $1

# We loop through the lines from second column until the very last

    for (i=2;i<=NF;i++) {

# If our column starts with Des then append our variable x with the value

        if ($i ~ /^Des/) {
            x = x FS $i
        }

# If our column starts with AB then append our variable y with the value

        else if ($i ~ /^AB/) {
            y = y FS $i
        }
    }

# Print variable y if x is empty else print both x and y

    print !x ? y : x y    

}
$ awk -f script.awk file
X1314448: Des|Des_g3808.t1 AB|AB0003DMP400018076_AB0003DMT400026495
X1314810: Des|Des_g33587.t1 AB|AB0003DMP400020961_AB0003DMT400030857
X1327159: AB|AB0003DMP400016823_AB0003DMT400024599 AB|AB0003DMP400017933_AB0003DMT400026257
X1330513: Des|Des_g36886.t1 AB|AB0003DMP400049952_AB0003DMT400073802
X132738: Des|Des_g491.t1 Des|Des_g6171.t1 Des|Des_g47565.t1 AB|AB0003DMP400005485_AB0003DMT400007895 AB|AB0003DMP400021388_PGS