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()
し、最初のカンマ文字まで行をストライプして列を削除するので、残りの内容は列の値になります。鍵後で使用するために。