如何仅保留以字符开头的行及其后的行

如何仅保留以字符开头的行及其后的行

我有一个 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

相关内容