从文件中收集特定的基因组数据并收集在相同的标题中

从文件中收集特定的基因组数据并收集在相同的标题中

我的文件中有基因组数据,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.1s。我怎样才能正确地做到这一点,以便在大型数据集上我不需要删除所有重复项?

答案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

相关内容