共通データに基づくファイルのマージ

共通データに基づくファイルのマージ

2つのcsvファイルがあります

ファイル1:

799001,8_802,3122,627654

ファイル2:

799001,567765,v567575

1列のキーで2つのファイルをマージしようとすると、ファイルがマージされることがわかりますが、file1の3列は印刷されません。

私の結果:

799001,2_802_3122,567765,v567575

予想出力:

799001,2_802_3122,627654,567765,v567575

私はこれを試しました:

awk -F , 'BEGIN { OFS = FS } FNR == NR { names[$1] = $2; next } ($1 in names) { print $1, names[$1], $2 , $3 , $4 }' file1 file2

なぜColumn3がマージされないのですか?

答え1

2つのファイルが結合フィールド(最初にカンマで区切られたフィールド)にソートされていると仮定すると、次のようになります。

$ join -t , file1 file2
799001,8_802,3122,627654,567765,v567575

データがソートされていない場合は、新しいソートファイルを作成するか、プロセス置換(これをサポートするシェルで)を使用してデータを事前ソートする必要があります。

$ join -t , <( sort file1 ) <( sort file2 )
799001,8_802,3122,627654,567765,v567575

そうでなければ考える1つまたは別のファイルの順序を維持するためにデータをソートするには、awk次のように使用できます。

$ awk -F , 'BEGIN { OFS = FS } NR == FNR { key[$1] = $0; next } ($1 in key) { k = $1; sub("^[^,]*,",""); print key[k], $0 }' file1 file2
799001,8_802,3122,627654,567765,v567575

これは似たようなあなたが持っているが保存できるものにワイヤー連想配列から。その後、ステートメントは、print最初のフィールドが削除された場合を除き、2番目のファイルの行に沿って最初のファイルに保存された値を出力しますsub()

ksub()呼び出しによって値が変更されるため、コードの2番目の部分にある変数が必要です$1

呼び出しはsub()これがFSカンマであると仮定します。代わりに実際の値を使用するには、FS次のいずれかを使用します。

sub("^[^" FS "]*" FS,"")

代わりに。FS単一文字の場合は機能します。

2番目のファイルのフィールド数に関する事前知識を使用しますか?sub()そして、変数へのやや混乱のk呼び出しを避けることができます。

$ awk -F , 'BEGIN { OFS = FS } NR == FNR { key[$1] = $0; next } ($1 in key) { print key[$1], $2, $3 }' file1 file2
799001,8_802,3122,627654,567765,v567575

関連情報