例として、このようなデータがあります。
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.txt
1 行ずつ読み込み、${parts[0]}
2 番目のファイルにプレフィックスが含まれていることを確認し、file2.txt
文字列をマージします。
動作原理sed -n -e "s/^${parts[0]} //p
:
-n
基本的には何も印刷されないことを意味します。-e
sed コマンドが続きます。s
パターン交換コマンドです。- 正規表現は、プレフィックス
^${parts[0]
で始まる行と一致します${parts[0]
(例:;sp|O15304|SIVA_HUMAN
)。 - たとえば、一致は空の
sp|O15304|SIVA_HUMAN
文字列に置き換えられます。 p
変換された行が印刷されます。 (変数に保存されますother_text
)
また見てくださいこの詳細な説明はこの特定のsed
コマンド。
ファイルから出力をリダイレクトするには、次のようにファイルをパラメータに設定して指定して、./merge.sh > output.txt
スクリプトをより柔軟にすることができます。fileone=$1
filetwo=$2
./merge.sh file1.txt file2.txt