我有一个文件.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
但是我如何获得没有“>”的文本行?
答案 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