「Sed」を使用してBashでプライムキー機能を実行する

「Sed」を使用してBashでプライムキー機能を実行する

私は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

関連情報