AWKを使用して2つのCSVファイルをマージしようとしています。 file1の最初の列がfile2の最初の列と一致する場合は、file1の3番目の列をfile2の2番目の列の値に変更したいと思います。一致するものがない場合は、変更せずに次の行に移動します。
ファイル1.csv
alice,soccer,24
bob,baseball,21
jessica,swimming,22
mike,running,20
ファイル2.csv
alice,5
jessica,9
希望の出力:
alice,soccer,5
bob,baseball,21
jessica,swimming,9
mike,running,20
これまで私のコードは次のようになります。
#!/bin/bash
awk -F"," 'BEGIN{OFS=","}
{ if (NR==NFR){
array[$1]=$1;
}
if ( $1 in array ){
$3=array[$2]
}
print
}' file2.csv file1.csv
答え1
努力する:
$ awk -F, 'FNR==NR{a[$1]=$2;next} $1 in a{$3=a[$1]} 1' OFS=, file2.csv file1.csv
alice,soccer,5
bob,baseball,21
jessica,swimming,9
mike,running,20
どのように動作しますか?
-F,
これにより、入力フィールド区切り文字がコンマに設定されます。
FNR==NR{a[$1]=$2;next}
読み取ると、
file2.csv
配列の最初のフィールドキーの下に2番目のフィールドが保存されますa
。の使用に注意してください
next
。これはawkに残りのコマンドをスキップし、次の行から始めるように指示します。たとえば、 を読んだ後の
file2.csv
配列の内容は とa
です。a['alice']=5
a['jessica']=9
$1 in a{$3=a[$1]}
読み取り時に
file1.csv
最初のフィールドが配列のキーとして存在する場合、a
3番目のフィールドはに格納されている値で更新されますa
。(私たちが読んでいる)内容が次のいずれ
$1 in a
かである場合、テストは真です。$1
file1.csv
鍵(値の1つではありません) arraya
。1
の略語です
{print}
。OFS=,
これにより、出力フィールド区切り文字がコンマに設定されます。