最初の列を使用して2つのファイルをマージする

最初の列を使用して2つのファイルをマージする

2つの異なるファイルがあり、最初の列を使用してその情報をマージしたいと思います。

ファイル1.txt

A,info1,info2
234,info3,info4
CD,info5,info6

ファイル2.txt

234,ccc,bb
CD,aaa,dd

期待される出力.csv

A,info1,info2,,
234,info3,info4,ccc,bb
CD,info5,info6,aaa,dd

awk(私のスクリプトではありません)を使ってみましたjoinが、grep目的の結果が得られませんでした。

awk -F "," 'FNR==NR {h[$1] = $2;next} BEGIN{ OFS = "\t"} {print $0,$2?h[$1]:"0"}' file1.txt prova2.txt

そして

join -a 1 <(sort file1.txt) <( sort file2.txt) > output.csv

誰でも私を助けることができますか?

ベストアンサー1

2つのファイルのフィールド数が等しい場合は、-o auto各ファイルの最初の行に基づいて各行のフィールド数を入力できます。デフォルトでは、欠落して-eいるフィールドはデフォルトで次のオプション値で埋められます。空白文字ですが、任意の文字に変更できます。ひもあなたが欲しい);

$ join -t, -a1 -o auto <(sort file1) <(sort file2)
234,info3,info4,ccc,bb
A,info1,info2,,
CD,info5,info6,aaa,dd

-t,また、入出力ファイルを指定するためのフィールド区切り文字を追加しました。
file2 にのみ存在する行を追加するには、その行を-a2コマンドに追加します。

上記のコマンドは、以下のコマンドの短縮バージョンで、出力したいフィールドを明示的に表します。

join -t, -a1 -o0,1.2,1.3,2.2,2.3 <(sort file1) <(sort file2)

-o #.kファイル番号のk最初の#フィールドを印刷します。
-o 0ペアリングできないラインがここに出力されます。


または以下を使用してくださいawk

awk 'BEGIN{ FS=OFS=","; na="" }
              { key=$1; sub(/[^,]*,/, "") }
NR==FNR       { file1[key]=$0; next }
(key in file1){ print key, file1[key], $0; delete file1[key] }

END{ for(key in file1) print key, file1[key], na, na }' file1 file2

実際には、{ key=$1; sub(/[^,]*,/, "") }最初の列からバックアップを取得sub()し、最初のカンマ文字まで行をストライプして列を削除するので、残りの内容は列の値になります。後で使用するために。

おすすめ記事