unix拆分FASTA使用循环,awk和拆分

时间:2016-08-23 12:19:04

标签: unix awk split fasta

我有一个很长的数据列表,如下所示(INPUT)。 我想分割数据,以便得到如下输出(所需的输出)。

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

之后的文本的缩短版本替换数组B中的那些行。

我认为最简单的方法是拆分" |"但是这不起作用(如果我替换"""我的代码不会发生分离; |&#34)

我的代码在下面,并在"之后很好地拆分。 "如果我更换" |" by" "在INPUT中,当我想在[]括号之间得到文本时,我遇到了麻烦,这并不总是存在而且总是只有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 {$0 = ">" $4}
1
'

请告诉我是否需要更多解释!

INPUT:

 >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

1 个答案:

答案 0 :(得分:2)

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

awk -F'|' '/^>gi/{a=1;match($NF,/\[([^]]*)]/, b);print ">"$4" "b[1];next}a{print}!$0{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 ">"$4" "b[1]; # display the line
    next # jump to the next record
}

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

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