ファイルごとに1つずつ、2つのソートされたデータセットを照合してマージしようとしています。各ファイルには、キーフィールドと関連値の2つの列が含まれています。生成される出力には、キーフィールド、最初のファイルの値(存在する場合)、および2番目のファイルの値(存在する場合)の3つの列を含める必要があります。一致しないデータ行を含める必要があります。
最初のファイル「ジョン」
apple,green
cherry,red
orange,orange
2番目のファイル「Jane」
apple,red
banana,yellow
cherry,yellow
kiwi,green
希望する結果
apple,green,red
banana,,yellow
cherry,red,yellow
kiwi,,green
orange,orange,
最初は、このことが私にとって面倒なことだと思った。join
LC_ALL=C join -j1 -a1 -a2 -t',' john jane
ただし、結果は常に-a1 -a2
2番目の列に一致しない値を入れます。
apple,green,red
banana,yellow
cherry,red,yellow
kiwi,green
orange,orange
理想的には、結果ファイルの適切な2番目または3番目の列にその値を配置することで、一致しない値がどのソースファイルに由来するかを判断できるはずですが、達成できる簡単な方法はわかりません。タイプ設定の詳細を知らなくても、これを行うことができますawk ... getline()
。
どんな提案がありますか?
ベストアンサー1
あなたが望む-o auto
:
join -t, -j 1 -a 1 -a 2 -o auto john jane
~からman join
:
-o FORMAT
従う
FORMAT
出力ラインを設定するとき
︙もしFORMAT
キーワードが 'auto
' の場合、各ファイルの最初の行は各行に出力されるフィールドの数を決定します。
またはより良い説明GNU Coreutils: 呼び出しの追加 (リンクをクリックすると入ることができます。結合の一般オプション):
'
-o auto
'" "キーワードを指定すると、
auto
出力形式は各ファイルの最初の行から推測されます。これは、デフォルトの出力形式と同じですが、行ごとに同じ数のフィールドが出力されることを保証します。不足しているフィールドはオプションに置き換えられ、-e
重複フィールドは削除されます。
% cat john
apple,green
cherry,red
orange,orange
% cat jane
apple,red
banana,yellow
cherry,yellow
kiwi,green
% join -t, -j 1 -a 1 -a 2 -o auto john jane
apple,green,red
banana,,yellow
cherry,red,yellow
kiwi,,green
orange,orange,