ファイルから特定のゲノムデータを収集し、同じヘッダーに収集

ファイルから特定のゲノムデータを収集し、同じヘッダーに収集

ファイルにはゲノムデータがあり、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

Genome.1はキーワードなので、作成したいリストに応じて変更してください。

答え2

パールを使って

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

関連情報