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