私の目標は、これら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
位置引数として解釈するようにしました。プログラムを常に一重引用符で囲む必要があります。awk
awk
'
a
a.txt
に基づいていなければならないと述べたが、で「代替値リスト」(配列に格納されている)を作成していますb.txt
。a[$1]=$1
このリスト()の最初のフィールドのみを保存しますが、コピー(たとえば)の行全体を保存する必要があります。b.txt
a.txt
a[$1]=$0
- に「キー」(最初の項目)が表示された場合は、の最初のフィールドのみの対応する行に置き換えますが、行全体を置き換える必要があります
b.txt
(例:代わりに)。a.txt
b.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