unix 使用循环、awk 和拆分来拆分 FASTA

unix split FASTA using a loop, awk and split

我有一长串数据组织如下 (INPUT)。 我想拆分数据,以便获得如下输出(所需的输出)。

下面的代码首先识别所有包含“>gi”的行,并将这些行的行数保存在一个名为 B 的数组中。 然后,在一个新文件中,它应该将数组 B 中的那些行替换为“>gi”

之后文本的缩短版本

我认为最简单的方法是在“|”处拆分,但这不起作用(如果我将“”替换为“|”,我的代码不会发生拆分)

我的代码在下面,如果我替换“|”,它会在“”之后很好地拆分通过输入中的“”,但是当我想在[]括号之间获取文本时我遇到了麻烦,它并不总是存在并且并不总是只有2个字...:

B=$( grep -n ">gi" 1VAO_1DII_5fxe_all_hits_combined.txt | cut -d : -f 1)

 awk <1VAO_1DII_5fxe_all_hits_combined.txt >seqIDs_1VAO_1DII_5fxe_all_hits_combined.txt -v lines="$B" '
BEGIN {split(lines, a, " "); for (i in a) change[a[i]]=1}
NR in change {[=10=] = ">" }
1
'

如果需要更多解释,请告诉我!

输入:

 >gi|9955361|pdb|1E0Y|A:1-560 Chain A, Structure Of The D170sT457E DOUBLE MUTANT OF VANILLYL- Alcohol Oxidase
 MSKTQEFRPLTLPPKLSLSDFNEFIQDIIRIVGSENVEVISSKDQIVDGSYMKPTHTHDPHHVMDQDYFLASAIVA

 >gi|557721169|dbj|GAD99964.1|:1-560 hypothetical protein NECHADRAFT_63237 [Byssochlamys spectabilis No. 5]
 MSETMEFRPMVLPPNLLLSEFNGFIRETIRLVGCENVEVISSKDQIHDGSYMDPRHTHDPHHIMEQDYFLASAIVAPRNV

期望的输出:

 >1E0Y
 MSKTQEFRPLTLPPKLSLSDFNEFIQDIIRIVGSENVEVISSKDQIVDGSYMKPTHTHDPHHVMDQDYFLASAIVAPRNV

 >GAD99964.1 Byssochlamys spectabilis No. 5
 MSETMEFRPMVLPPNLLLSEFNGFIRETIRLVGCENVEVISSKDQIHDGSYMDPRHTHDPHHIMEQDYFLASAIVA

这可以用 awk (gnu awk) 一步完成:

awk -F'|' '/^>gi/{a=1;match($NF,/\[([^]]*)]/, b);print ">"" "b[1];next}a{print}![=10=]{a=0}' input > output

以更易读的方式:

/^>gi/ {  # when the line starts with ">gi"
    a=1;  # set flag "a" to 1
    # extract the eventual part between brackets in the last field
    match($NF,"\[([^]]*)]", b);
    print ">"" "b[1]; # display the line
    next # jump to the next record
}

a { print } # when "a" (allowed block) display the line

![=11=] { a=0 } # when the line is empty, set "a" to 0 to stop the display