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
我有一长串数据组织如下 (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