SEDまたはAWKを使用してあるファイルの値を別のファイルに置き換える

SEDまたはAWKを使用してあるファイルの値を別のファイルに置き換える

私が解決しようとしている問題を解決するのに役立つ人がいますか?現在、2つのファイルで作業しています。ファイルの内容は、値が次の2つの列で構成されるリストにあります。

ファイル_A.txt:

1 MSFT
2 YHOO
3 GOOG
4 APPL
5 SUN

ファイル_B.txt:

### Client A ###
1
2
3

### Client B ###
2
3
4
5

++++

私は代替方法を使用して1が発生するたびにファイルBの値をMFSTに変更しようとしています。ファイルBに2が表示されるたびに、値をYHOOに、3をGOOGに変更します。

現在私ができる唯一の方法は、対話型sedを使用して受動的で長いプロセスを利用することです。使用できる繰り返し構文はありますか?

sed -i 's/\1\>/MSFT/g' FILE_B.txt

非常にありがとう

答え1

そうですか?

awk 'NR==FNR{a[$1]=$2} NR!=FNR{if($1 in a){$1=a[$1]};print}' File_A.txt FILE_B.txt
### Client A ###
MSFT
YHOO
GOOG

### Client B ###
YHOO
GOOG
APPL
SUN

これがうまくいく場合は、出力をtmpファイルにリダイレクトしてから、FILE_B.txtを介してtmpファイルをmvします。spongeインストールされている場合は、次のことができます。

awk 'NR==FNR{a[$1]=$2} NR!=FNR{if($1 in a){$1=a[$1]};print}' File_A.txt FILE_B.txt | sponge FILE_B.txt

答え2

本当に怖いsedソリューション:

  1. sedを使用してFILE_Aをsedコマンドに変換する
  2. このコードをFILE_Bに適用してください。
sed "$(sed 's/^/s!^/;s/ /$!/;s/$/!/' FILE_A.txt)" FILE_B.txt

答え3

純粋主義者として、私は単一のソリューションを使用することを好みますsedが、一部の人はこれを読むことができないと思うかもしれません。

sed '/^[0-9]* /{H;d;};G;s/^\([0-9]*\)\n.*\n\1 \([A-Z]*\).*/\2/;P;d' FILE_A.txt FILE_B.txt

これを説明したい人はいないと思います。

関連情報