同様の文字列で2つのtxtファイルをマージする方法

同様の文字列で2つのtxtファイルをマージする方法

例として、このようなデータがあります。

sp|O15304|SIVA_HUMAN    MPKRSCPFADVAPLQLKVRVSQRELSRGVCAERYSQEVFEKTKRLLFLGAQAYLDHVWDEGCAVVHLPESPKPGPTGAPRAARGQMLIGPDGRLIRSLGQASEADPSGVASIACSSCVRAVDGKAVCGQCERALCGQCVRTCWGCGSVACTLCGLVDCSDMYEKVLCTSCAMFET 
tr|A0A1B1L9R9|A0A1B1L9R9_BACTU  MNKQLFLASLKETQKSILSYACGAALYLWLLIWIFPSMVSAKGLNELIAAMPDSVKKIVGMESPIQNVMDFLAGEYYSLLFIIILTIFCVTVATHLIARHVDKGAMAYLLATPVSRVQIAITQATVLILGLLIIVSVTYVAGLVGAEWFLQDNNLNKELFLKINIVGGLIFLVVSAYSFFFSCICNDERKALSYSASLTILFFVLDMVGKLSDKLEWMKNLSLFTLFRPKEIAEGAYNIWPVSIGLIAGALCIFIVAIVVFKKRDLPL 

以下のような文字列を持つ別のデータがあります。

tr|A0A1B1L9R9|A0A1B1L9R9_BACTU This is just an example 1-20-100

私はこれらの2つのデータを一致させ、最初のテストで2番目のtxtの似たような文字列を持つ2番目のテキストファイルにセクションを貼り付けることができます。例えば。

最初のデータにはこれがあります。

sp|O15304|SIVA_HUMAN
tr|A0A1B1L9R9|A0A1B1L9R9_BACTU

2番目のデータには、最初のデータの1つと一致するものだけがあります。

tr|A0A1B1L9R9|A0A1B1L9R9_BACTU

その後、出力は次のようになります。

sp|O15304|SIVA_HUMAN    MPKRSCPFADVAPLQLKVRVSQRELSRGVCAERYSQEVFEKTKRLLFLGAQAYLDHVWDEGCAVVHLPESPKPGPTGAPRAARGQMLIGPDGRLIRSLGQASEADPSGVASIACSSCVRAVDGKAVCGQCERALCGQCVRTCWGCGSVACTLCGLVDCSDMYEKVLCTSCAMFET 
tr|A0A1B1L9R9|A0A1B1L9R9_BACTU This is just an example 1-20-100 MNKQLFLASLKETQKSILSYACGAALYLWLLIWIFPSMVSAKGLNELIAAMPDSVKKIVGMESPIQNVMDFLAGEYYSLLFIIILTIFCVTVATHLIARHVDKGAMAYLLATPVSRVQIAITQATVLILGLLIIVSVTYVAGLVGAEWFLQDNNLNKELFLKINIVGGLIFLVVSAYSFFFSCICNDERKALSYSASLTILFFVLDMVGKLSDKLEWMKNLSLFTLFRPKEIAEGAYNIWPVSIGLIAGALCIFIVAIVVFKKRDLPL 

ベストアンサー1

このような単純なBashスクリプトはうまくいきますが、より短い方法があるかもしれません。

file1.txt:

sp|O15304|SIVA_HUMAN    MPKRSCPFADVAPLQLKVRVSQRELSRGVCAERYSQEVFEKTKRLLFLGAQAYLDHVWDEGCAVVHLPESPKPGPTGAPRAARGQMLIGPDGRLIRSLGQASEADPSGVASIACSSCVRAVDGKAVCGQCERALCGQCVRTCWGCGSVACTLCGLVDCSDMYEKVLCTSCAMFET 
tr|A0A1B1L9R9|A0A1B1L9R9_BACTU  MNKQLFLASLKETQKSILSYACGAALYLWLLIWIFPSMVSAKGLNELIAAMPDSVKKIVGMESPIQNVMDFLAGEYYSLLFIIILTIFCVTVATHLIARHVDKGAMAYLLATPVSRVQIAITQATVLILGLLIIVSVTYVAGLVGAEWFLQDNNLNKELFLKINIVGGLIFLVVSAYSFFFSCICNDERKALSYSASLTILFFVLDMVGKLSDKLEWMKNLSLFTLFRPKEIAEGAYNIWPVSIGLIAGALCIFIVAIVVFKKRDLPL

file2.txt:

tr|A0A1B1L9R9|A0A1B1L9R9_BACTU This is just an example 1-20-100

merge.sh:

fileone="file1.txt"
filetwo="file2.txt"
IFS=$'\n'
for line in `cat $fileone`; do
    #convert to array
    IFS=' '
    read -ra parts -d '' <<< "$line"

    other_text=$(cat $filetwo | sed -n -e "s/^${parts[0]} //p")
    echo "${parts[0]} $other_text ${parts[1]}"
done

スクリプトはfile1.txt1 行ずつ読み込み、${parts[0]}2 番目のファイルにプレフィックスが含まれていることを確認し、file2.txt文字列をマージします。

動作原理sed -n -e "s/^${parts[0]} //p

  • -n基本的には何も印刷されないことを意味します。
  • -esed コマンドが続きます。
  • sパターン交換コマンドです。
  • 正規表現は、プレフィックス^${parts[0]で始まる行と一致します${parts[0](例:; sp|O15304|SIVA_HUMAN)。
  • たとえば、一致は空のsp|O15304|SIVA_HUMAN文字列に置き換えられます。
  • p変換された行が印刷されます。 (変数に保存されますother_text

また見てくださいこの詳細な説明はこの特定のsedコマンド。

ファイルから出力をリダイレクトするには、次のようにファイルをパラメータに設定して指定して、./merge.sh > output.txtスクリプトをより柔軟にすることができます。fileone=$1filetwo=$2./merge.sh file1.txt file2.txt

おすすめ記事