我有一个 FASTA 文件,其中故意包含一些带有错误标头的序列(即缺少>
)和一些带有良好标头的序列。该文件格式良好,核苷酸序列位于一行。
例子 :
2865958
AACTACTACAG
>hCoV-19/2832832
ACTCGGGGGG
28328332
ATTCCCCG
>hCoV-19/2789877
ACTCGGCCC
我只想保留具有正确标题的序列(即以 开头的行>
),如下所示:
>hCoV-19/2832832
ACTCGGGGGG
>hCoV-19/2789877
ACTCGGCCC
我尝试了各种方法( sed、grep、awk )但没有正确的结果:
awk '/^>/ { ok=index($0,"hCoV")!=0;} {if(ok) print;}' combined_v4.fa > combined_v5.fa
sed -n '/^>.*hCoV/,/^>/ {/^>.*hCoV/p ; /^>/! p}' combined_v4.fa > combined_v5.fa
grep -w ">" -A 1 combined_v4.fa > combined_v5.fa
你知道该怎么做吗?
答案1
Tellgrep
也查找以 开头的行>
,并包含其后面的行:
grep -A1 --no-group-separator '^>' combined_v4.fa > combined_v5.fa
如果您的版本grep
不支持--no-group-separator
,请尝试以下操作:
grep -A1 '^>' combined_v4.fa | grep -v '^--$' > combined_v5.fa
答案2
这是 sed 的一种方法:
sed -n '/^>/!d;N;p' file
请注意,如果输入的最后一行以“>”开头,则不会打印它。
使用 awk:
awk 'prev {print prev ORS $0; prev=""} /^>/ {prev=$0}' file
等到“>”后面的行打印这两行。除了正则表达式之外,index()
还可以使用:
awk 'prev {print prev ORS $0; prev=""} index($0,">")==1 {prev=$0}' file
^>
是匹配以“>”开头的字符串的正则表达式。返回字符串“">”的起始位置,如果记录以此开头,则index($0,">")
该位置必须等于一 ( )。...==1
为了确保它也有“hCoV”:
sed -n '/^>/!d;/hCoV/!d;N;p' file
awk 'prev {print prev ORS $0; prev=""} /^>/ && /hCoV/ {prev=$0}' file
答案3
使用 awk,你可以这样做:
awk '/^>/ {c=2} c-- > 0' file
>
看到时打印 2 行。
答案4
你awk
可以尝试:
awk 'f {print; f=0} /^>/ {print;f=1}' file
>hCoV-19/2832832
ACTCGGGGGG
>hCoV-19/2789877
ACTCGGCCC
- 这篇优秀的文章可以帮助您:
“使用 sed 或 awk 打印匹配模式后的一行”:https://stackoverflow.com/questions/17908555/printing-with-sed-or-awk-a-line-following-a-matching-pattern