次のテキストファイルがいくつかあります。
ファイル1:
>ID_000_FLNNKGHD_01376
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_MGCDKLCO_02388
ATGAAGGTGGAAAAAACACCGCTTGCATTT
>ID_000_OMAMOGKP_02746
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA
ファイル2:
>ID_000_KGHDAAD_06245
AAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_KOAAFG_40481
CCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
>ID_000_GPAAAGVV_07764
--AAATTGGTGG---------ACACCGCTTTT--
など。
各ファイルの1行目と2行目、3行目と4行目などを接続し、次のように各結果に対して新しいファイルを出力する必要があります。
ファイル1出力:
>ID_000_FLNNKGHD_01376-ID_000_KGHDAAD_06245
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAATAAATACAGAGGAAAAAACACCGCTTGCATACAAT
ファイル2出力:
>ID_000_MGCDKLCO_02388-ID_000_KOAAFG_40481
ATGAAGGTGGAAAAAACACCGCTTGCATTTCCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
ファイル3出力:
>ID_000_OMAMOGKP_02746-ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA--AAATTGGTGG---------ACACCGCTTTT--
など。
*最初の行は ">"で始まり、各文字列間に "-"接続を追加する必要があります。 2行目はちょうど合わされます。
出力名はfile_1.fastaからfile_n.fastaとして指定する必要があります。
ありがとうございます!
答え1
1つの方法は次のとおりです。
paste file1.fa file2.fa |
sed -E 's/\s+>/-/; s/\s+//g' |
awk -v c=0 '{ if(/^>/){c++} print > "file"c".pasted.fa"; }'
これを説明するために、各コマンドの出力を見てみましょう。
$ paste file1.fa file2.fa
>ID_000_FLNNKGHD_01376 >ID_000_KGHDAAD_06245
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAAT AAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_MGCDKLCO_02388 >ID_000_KOAAFG_40481
ATGAAGGTGGAAAAAACACCGCTTGCATTT CCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
>ID_000_OMAMOGKP_02746 >ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA --AAATTGGTGG---------ACACCGCTTTT--
したがって、これは各ファイルの隣にあるすべての行を印刷します。ファイル1のライン1とファイル2のライン1、ファイル1のライン2とファイル2のライン2等である。ただし、ここには>
削除する必要がある追加スペースと追加スペースがあります。sed
現在進行中の作業は次のとおりです。
$ paste file1.fa file2.fa | sed -E 's/\s+>/-/; s/\s+//'
>ID_000_FLNNKGHD_01376-ID_000_KGHDAAD_06245
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAATAAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_MGCDKLCO_02388-ID_000_KOAAFG_40481
ATGAAGGTGGAAAAAACACCGCTTGCATTTCCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
>ID_000_OMAMOGKP_02746-ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA--AAATTGGTGG---------ACACCGCTTTT--
最後のステップとして、awk
スクリプトは次のことを行います。
awk -v c=0
:awk
変数を起動してc
に設定します0
。if(/^>/){c++}
c
:で始まる行が見つかるたびに値を1ずつ増やします>
。print > "file"c".pasted.fa"
:現在の行を名前付きファイルに印刷し、file
現在の値を追加しc
ます.pasted.fa
。
実行例の最終結果は次のとおりです。
$ ls *pasted*
file1.pasted.fa file2.pasted.fa file3.pasted.fa
$ cat file1.pasted.fa
>ID_000_FLNNKGHD_01376-ID_000_KGHDAAD_06245
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAATAAATACAGAGGAAAAAACACCGCTTGCATACAAT
$ cat file2.pasted.fa
>ID_000_MGCDKLCO_02388-ID_000_KOAAFG_40481
ATGAAGGTGGAAAAAACACCGCTTGCATTTCCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
$ cat file3.pasted.fa
>ID_000_OMAMOGKP_02746-ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA--AAATTGGTGG---------ACACCGCTTTT--