如果一行和下一行以相同的模式开始,如何不打印一行?

时间:2021-07-29 19:07:59

标签: regex awk sed

我有一个文件.fa:

>ABC
TGTGTGT
AGAGAGA
TGTAGTA
>BDC
>DTR
>EDF
AGAGGTG
AGTGACA
CAGTGAC

我想保留没有 ">" 的行,只有在紧接着的下一行没有 ">" 时才保留带有 ">" 的行:

>ABC
TGTGTGT
AGAGAGA
TGTAGTA
>EDF
AGAGGTG
AGTGACA
CAGTGAC

查看 this post 的答案,我看到 awk '/^>/{x=$0} !/^>/{if(x){print x;x=0;}}' file.fa 打印出我想要的标题行(带有“>”):

>ABC
>EDF

但是我如何获得没有“>”的文本行?

6 个答案:

答案 0 :(得分:7)

使用 --timestamp

sed

如果一行以 $  sed '/^>/ { N; /\n>/ D; }' input.txt >ABC TGTGTGT AGAGAGA TGTAGTA >EDF AGAGGTG AGTGACA CAGTGAC 开头,读取下一行并将其附加到模式空间。如果它也以>开头,则删除模式空间的第一行,然后将刚刚读取的第二行作为要查看的新输入行重复。打印所有其他内容。

答案 1 :(得分:6)

您可以使用:

awk '!/^>/ {if (prev != "") print prev; print; prev=""}
/^>/ {prev = $0}' file

>ABC
TGTGTGT
AGAGAGA
TGTAGTA
>EDF
AGAGGTG
AGTGACA
CAGTGAC

答案 2 :(得分:4)

仅使用您显示的示例,请尝试遵循 awk 代码。简单的解释是,将 RS(记录分隔符)设置为 > 并将字段分隔符设置为新行。如果 NF 大于 2,则使用 > 及其值打印该行。

awk -v RS='>' -v FS='\n' 'NF>2{sub(/\n$/,"");print ">" $0}' Input_file

答案 3 :(得分:4)

$ awk '!/>/{print p $0; p=""; next} {p=$0 ORS}' file
>ABC
TGTGTGT
AGAGAGA
TGTAGTA
>EDF
AGAGGTG
AGTGACA
CAGTGAC

以上假设您没有将 > 行作为输入的最后一行。

答案 4 :(得分:3)

我们总是有 perl:

perl -0777 -ne 'print $1 while(/^(>.*\R^[^>][\s\S]*?)(?=^>|\z)/gm)' file
>ABC
TGTGTGT
AGAGAGA
TGTAGTA
>EDF
AGAGGTG
AGTGACA
CAGTGAC

在 awk 中你可以这样做:

awk -F"^>" 'NF>1{p=$0 ORS; next}
{printf "%s%s", p, $0 ORS; p=""}' file

答案 5 :(得分:2)

这可能对你有用(GNU sed):

sed 'N;/^>.*\n>/!P;D' file