他のファイルを参照して行を更新する

他のファイルを参照して行を更新する

以下に示すように、カンマで区切られた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

仕組み:

  1. -F, -v OFS=,

    これにより、入力フィールドと出力フィールドの区切り文字がコンマに設定されます。

  2. FNR==NR{a[$1]=$2; next}

    最初のファイルを読み込むとき、source.txt2番目のフィールドの値を$2最初のフィールドキーの下の連想配列に格納します。その後、残りのコマンドをスキップしてジャンプして再起動します。a$1next

  3. NF==1{$2=a[$1]}

    現在行にフィールドが1つしかない場合は、2番目のフィールドを連想配列の値に割り当てますa

  4. 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

関連情報