我的文件中有基因组数据,genomes-seq.txt
.序列的标题以 开头>
,然后是基因组名称:
>genome.1
atcg
atcg
atcggtc
>genome.2
atct
tgcgtgctt
attttt
>genome.
sdkf
sdf;ksdf
sdlfkjdslc
edsfsfv
>genome.3
as;ldkhaskjd
asdkljdsl
asdkljasdk;l
>genome.4
ekjfhdhsa
dsfkjskajd
asdknasd
>genome.1
iruuwi
sdkljbh
sdfljnsdl
>genome.234
efijhusidh
siduhygfhuji
>genome.1
ljhdcj
sdljhsdil
fweusfhygc
我想在一个文件中收集基因组 1 的类似数据,如下所示:
>genome.1
atcg
atcggtc
iruuwi
sdkljbh
sdfljnsdl
ljhdcj
sdljhsdil
fweusfhygc
但每次我使用 sed 执行此操作时,我都会得到:
>genome.1
atcg
atcg
atcggtc
>genome.1
iruuwi
sdkljbh
sdfljnsdl
>genome.1
ljhdcj
sdljhsdil
fweusfhygc
即多个genome.1
s。我怎样才能正确地做到这一点,以便在大型数据集上我不需要删除所有重复项?
答案1
$sed -nr /\>genome.1/,/^$/p file | sed '2,${/^>genome.1$/d}'
>genome.1
atcg
atcggtc
iruuwi
sdkljbh
sdfljnsdl
ljhdcj
sdljhsdil
fweusfhygc
基因组.1 是关键字,根据您想要生成的列表进行更改。
答案2
用perl
perl -00 -ne 'if (/^>genome\.1\n/) {s/// if $. > 1; print}' file
答案3
使用 awk:
{
if (/^>/)
in_section = 0;
if ($0 == ">genome.1") {
in_section = 1;
if (!section_count++)
print;
} else if (in_section)
print;
}
用法:
awk '{ if (/^>/) in_section = 0; if ($0 == ">genome.1") { in_section = 1; if (!section_count++) print; } else if (in_section) print; }' genome.txt
答案4
好吧,如果从 awk 开始,那么试试这个:
echo ">genome.1";awk 'BEGIN{RS=">"}{if($1 == "genome.1"){for(i=1;i<NF;i++){print $(i+1)}}}' file |sort -u
将RS=">"
每个正在运行的“基因组”记录分开,在每个记录中打印所有字段,但首先打印sort
唯一的输出列表(参数-u
)。如果你设置了RS=">genome\."
你可以写短:
echo -n ">genome.";awk 'BEGIN{RS=">genome."}/1/{print $0}' file |sort -ur