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()
。
k
sub()
呼び出しによって値が変更されるため、コードの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