以下のようにfileA.txtがあります。
title trial_exp values
Version 1.0
Blank1 0.010
Blank2 0.200
Blank3 0.100
Test_field_Asia 1.500
Test_field_Europe 0.900
Test_field_America 2.000
次に、次のようなfileB.txtがあります。
Test_field_Asia Thailand
Test_field_Europe UK
Test_field_America Mexico
fileAの列1のすべての名前をfileBの列1の名前と一致させ、一致するものが見つかった場合は列2の値を変更しようとします。
希望の出力:
title trial_exp values
Version 1.0
Blank1 0.010
Blank2 0.200
Blank3 0.100
Test_field_Asia Thailand 1.500
Test_field_Europe UK 0.900
Test_field_America Mexico 2.000
次のコードを試しました。
awk 'NR==FNR{rec[$1]=$2;next}{temp=$1} temp in rec{$2=rec[temp]}1' fileA.txt fileB.txt
ただし、交換は完了しておらず、元のfileA.txtが印刷されました。
誰かがこのコードの問題を説明したり、代替ソリューションを提案したりできますか?
ベストアンサー1
これは解決策。
- ファイルの作成
myscript.sh
#!/bin/bash
awk 'BEGIN{FS=",";OFS="\t"}
FNR==NR{myfile2[$1]=$2; next}
FNR>1{if(myfile2[$1]){print $1, myfile2[$1], $3,NR}else{print $1,$2,$3}}
' fileB.txt fileA.txt
- 実行してください:
chmod +x myscript.sh
./myscript.sh
次のような出力が得られます。
Version 1.0
Blank1 0.010
Blank2 0.200
Blank3 0.100
Test_field_Asia Thailand 1.500 9
Test_field_Europe UK 0.900 10
Test_field_America Mexico 2.000 11
- 出力でカンマを区切り文字として使用するには、変更できます。
OFS=","
次の出力が表示されます。
Version,1.0,
Blank1,,0.010
Blank2,,0.200
Blank3,,0.100
Test_field_Asia,Thailand,1.500,9
Test_field_Europe,UK,0.900,10
Test_field_America,Mexico,2.000,11
- 任意に選択できる。
fileA.txt
タイトル(最初の行)を含めたい場合ㅏ)簡単に条件を変更できます。FNR>=1
または雨)スクリプトを簡単に書き直してください。
#!/bin/bash
awk 'BEGIN{FS=",";OFS="\t"}
FNR==NR{myfile2[$1]=$2; next}
myfile2[$1]{print $1, myfile2[$1], $3; next;}{print $1,$2,$3}
' fileB.txt fileA.txt
最後に、詳細な例については、以下をお読みください。 https://www.baeldung.com/linux/awk-multiple-input-files