AWKを使用して2つのtxtファイルを1つにマージし、不足しているアイテムを追加する

AWKを使用して2つのtxtファイルを1つにマージし、不足しているアイテムを追加する

私の目標は、これら2つのファイルを1つにマージすることです。最初のエントリが2番目のファイルにある場合は最初に読み込み、コピーでない場合は更新します。

  • 最初のファイルa.txt
    AAA;2020-09-01;Y
    BBB;2020-09-01;Y
    CCC;2020-09-01;Y
    
  • 2番目のファイルb.txt
    AAA;2020-09-01;Y;21/08/2020
    BBB;2020-09-01;Y
    
  • 希望する結果c.txt
    AAA;2020-09-01;Y;21/08/2020
    BBB;2020-09-01;Y
    CCC;2020-09-01;Y
    

このコードを試しましたが、結果にCCC元のデータがありませんでした。この問題をどのように解決できますか?

gawk -F, "FNR==NR{a[$1]=$1;next} $1 in a{$1=a[$1]} 1" OFS=, a.txt b.txt > c.txt

答え1

アプローチの問題は次のとおりです。

  • ,ファイルは;- で区切られていますが、フィールド区切り文字として指定しました。
  • "シェルがプログラムをフィールドとして解釈するのではなく、$1位置引数として解釈するようにしました。プログラムを常に一重引用符で囲む必要があります。awkawk'
  • aa.txtに基づいていなければならないと述べたが、で「代替値リスト」(配列に格納されている)を作成していますb.txt
  • a[$1]=$1このリスト()の最初のフィールドのみを保存しますが、コピー(たとえば)の行全体を保存する必要があります。b.txta.txta[$1]=$0
  • に「キー」(最初の項目)が表示された場合は、の最初のフィールドのみの対応する行に置き換えますが、行全体を置き換える必要がありますb.txt(例:代わりに)。a.txtb.txt$0=a[$1]$1=a[$1]

それで、次のようなものを探しているようです。

gawk -F';' 'FNR==NR{a[$1]=$0; next} ($1 in a) {$0=a[$1]} 1' b.txt a.txt > c.txt

関連情報