一致しない行を含む、2つの列を持つ2つのファイルをそれぞれ関連付けます。

一致しない行を含む、2つの列を持つ2つのファイルをそれぞれ関連付けます。

ファイルごとに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 -a22番目の列に一致しない値を入れます。

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,

おすすめ記事