我有一个文件,在一行中有几个未分类的东西,我想将它放入一个新文件
这是我所拥有的文件的一部分示例:
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_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 | ...”。
我已经尝试了几件事,看起来最后一行使得无法使用管道和grep,虽然我不确定,因为我已经看到使用该方法完成了一些很棒的事情。我有一些Perl的经验,但不知道如何使用它来解决这个问题。我也尝试过使用awk,这可能是解决它的最佳方法,但我也没有使用它的工作解决方案。
我非常感谢有关如何解决这个问题的任何想法。
答案 0 :(得分:3)
# 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