file1の一致する文字列をfile2の他の文字列に置き換える方法

file1の一致する文字列をfile2の他の文字列に置き換える方法

私は最近bashを使い始めましたが、通常は手動で実行する必要があるいくつかのタスクを自動化するためにいくつかのスクリプトを書くことを望む分子生物学者です。

以下のように2つのファイル(rev.fastaおよび)があります。index_rev.fasta

$ head rev.fasta
>1
bc-1
>2
bc-1
>3
bc-1
>4
bc-1
>5
bc-1
$ head necessary_files/index_rev.fasta
>rev-bc-1
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>rev-bc-2
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG
>rev-bc-3
TTGCTACGGTTGACCATGCAGTTAGTCTCGTGGGCTCGG
>rev-bc-4
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
>rev-bc-5
GCAGGTGGGCATCCGGACCGATATGTCTCGTGGGCTCGG

bashコマンドを書きたい

  1. rev.fasta類似またはsed 's/>rev-//g' necessary_files/index_rev.fasta類似の一致grep
  2. (たとえば)bc-.*$で見つかった一致を(たとえば)ファイルの次の行に置き換えます。rev.fastabc-1necessary_files/index_rev.fastaTGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGGbc-1

結果は次のとおりです。

>1
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>2
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>3
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG

メモ:

重要な情報のいくつか:始めbc-から116

どうすればいいのかわかりません。私はいくつか試してみましたが、これは私ができることよりも複雑です。どんなアイデアがありますか?

ベストアンサー1

私の質問の理解は、インデックスファイルに基づいてfatsaファイルを検索したいということです。以下の回答では、インデックスファイルはPatterns.txtです。また、プロセスをテストしてデモンストレーションするためにファイルをいくつか変更しました。この回答を読んだ後は、独自のPattern.txtファイルを使用できます。

したがって、仮定は次のようになります。

$ cat fasta
>rev-bc-1
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>rev-bc-2
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG
>rev-bc-3
TTGCTACGGTTGACCATGCAGTTAGTCTCGTGGGCTCGG
>rev-bc-4
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
>rev-bc-5
GCAGGTGGGCATCCGGACCGATATGTCTCGTGGGCTCGG

$ cat patterns.txt 
>1
bc-4
>2
bc-2

まず、このコマンドを実行して、fastaファイルからPattern.txtに必要なコンテンツを抽出します。

$ awk '/bc/{print}' patterns.txt | xargs -I{} awk -v q=$(echo {}) '($0 ~ q){getline; print}' fasta
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG

この出力を一時ファイルに保存します。

次に、2番目のコマンドを実行して最終結果を取得します。

awk '!/bc/{print}' patterns.txt | paste -d '\n' - fasout

>1
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
>2
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG

説明:最初のコマンドは、Pattern.txtからbc-1、bc-2などを含む行を抽出します。次に、その行を見つけるために2番目のawk(一度に1つずつ)にパイプされ、一度見つかったら、awkのgetlineオプションを使用して次の行を印刷します。

2番目のコマンドは、単にPattern.txtファイルをfastoutとマージして、bc-1、bc-2などの行をfasoutの内容で置き換えることを可能にします。

これが実際に望む解決策であるかどうかわからないので、言及していないいくつかの注意事項があります。その場合は、後で回答を修正して含めます。

おすすめ記事