私が解決しようとしている問題を解決するのに役立つ人がいますか?現在、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ソリューション:
- sedを使用してFILE_Aをsedコマンドに変換する
- このコードを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
これを説明したい人はいないと思います。