私はbashを使用しており、sedコマンドを使用して文字列を一致させ、2つのファイル間の別の文字列に置き換えようとしています。
目的: [sp_* Var_Names] を含む他のファイルと一致させ、すべての文字列 [sp_*] を置き換えます。注:1. 2つのファイルの順序は同期されますが、連続しないため、貼り付けは使用できません。 2. この機能は mysql の primeKey 操作と似ています。
ファイル1
+--sp_O00574_
|
+--sp_Q9TV16_
|
| +--sp_O18983_
| +--| (52)
| | | +--sp_Q9BDS6_
| | +--| (26)
| | | +--sp_O19024_
| | +--| (29)
| | +--sp_Q9XT45_
ファイル2
O00574 CXCR6_HUMAN
Q9TV16 CXCR6_PANTR
O18983 CXCR6_CHLAE
Q9BDS6 CXCR6_MACFA
O19024 CXCR6_MACNE
Q9XT45 CXCR6_MACMU
目的:sed -ie 's/O00574/CXCR6_HUMAN/g' File1へ
インラインBashスクリプト:
cat File2 | while read id; do upID=`echo $id | cut -d " " -f1`; upName=`echo $id | cut -d " " -f2`; sed -ie 's/sp_$upID/$upName/g' File1; done
script.sh
#/bin/bash
cat File2 | while read id;
do
upID=`echo $id | cut -d " " -f1`
upName=`echo $id | cut -d " " -f2`
sed -ie 's/sp_$upID/$upName/g' File1
done
質問: sed コマンドはループ内では機能しません。 File1ではまったく変更は観察されませんでした。スクリプトでsedコマンドをエコーしてから端末で実行すると、期待どおりに機能します。何が問題なのかわかりません。
貴重なご意見や解決に感謝します。
答え1
繰り返すのではなく、インデックスファイル(File2)からsedスクリプトを生成し、File1に対してスクリプトを実行します。はるかに高速になります:).
awk '{ print "s/sp_"$1"/"$2"/g"}' File2.txt > tranform.sed
次に、次のようにします。
sed -i -f transform.sed File1.txt
したがって、スクリプト全体は次のようになります。
awk '{ print "s/sp_"$1"/"$2"/g"}' File2.txt > transform.sed
sed -f transform.sed File1.txt
## if you want to remove your transformation file
rm transform.sed