以下に示すように、カンマで区切られた2つのファイルがあります。
cat source.txt
A,1000
B,3000
C,2500
D,5000
E,4000
F,3000
cat test.txt
A,1000
C
D,5000
B
E
予想される出力が次のようになるように、source.txtファイルを参照してtest.txtファイルを更新するにはどうすればよいですか?
cat test.txt
A,1000
C,2500
D,5000
B,3000
E,4000
答え1
努力する:
$ awk -F, -v OFS=, 'FNR==NR{a[$1]=$2; next} NF==1{$2=a[$1]} 1' source.txt test.txt
A,1000
C,2500
D,5000
B,3000
E,4000
仕組み:
-F, -v OFS=,
これにより、入力フィールドと出力フィールドの区切り文字がコンマに設定されます。
FNR==NR{a[$1]=$2; next}
最初のファイルを読み込むとき、
source.txt
2番目のフィールドの値を$2
最初のフィールドキーの下の連想配列に格納します。その後、残りのコマンドをスキップしてジャンプして再起動します。a
$1
next
NF==1{$2=a[$1]}
現在行にフィールドが1つしかない場合は、2番目のフィールドを連想配列の値に割り当てます
a
。1
これは略語ですこの行を印刷してください。
ファイルを永久に変更します。
すべてのバージョンのawkで、次のコマンドを使用してファイルを永久に更新できますtest.txt
(推奨)。
awk -F, -v OFS=, 'FNR==NR{a[$1]=$2; next} NF==1{$2=a[$1]} 1' source.txt test.txt >temp && mv temp test.txt
または、最新バージョンのGNU awk
(GNUとも呼ばれるgawk
)を使用している場合:
awk -i inplace -F, -v OFS=, 'FNR==NR{a[$1]=$2; print; next} NF==1{$2=a[$1]} 1' source.txt test.txt
答え2
次のようにしてみましたが、うまくいきました。
注文する:
for i in `awk -F "," '{print $1}' file2`; do k=`awk -F "," -v i="$i" '$1 == i {print $2}' file1`; echo $i;echo $k;done| sed "N;s/\n/,/g"
出力
A,1000
C,2500
D,5000
B,3000
E,4000