AWKを使用して2つのCSVファイルを1つに結合する

AWKを使用して2つのCSVファイルを1つに結合する

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']=5a['jessica']=9

  • $1 in a{$3=a[$1]}

    読み取り時にfile1.csv最初のフィールドが配列のキーとして存在する場合、a3番目のフィールドはに格納されている値で更新されますa

    (私たちが読んでいる)内容が次のいずれ$1 in aかである場合、テストは真です。$1file1.csv(値の1つではありません) array a

  • 1

    の略語です{print}

  • OFS=,

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

おすすめ記事