間違った出力を提供するJoinコマンドはありますか?

間違った出力を提供するJoinコマンドはありますか?

私は次のようにSolaris 5.8バージョンに2つの単純なファイルを含めたいと思います。

~/temp/s: cat 1
work1 a 8058 51
work2 b 15336 51

~/temp/s: cat 2
8058 77-11:29:32 /apps/sas
15336 100-12:23:49 /local/hotfix

~/temp/s: join -1 3 -2 1 1 2
8058 work1 a 51 77-11:29:32 /apps/sas (The other line is missing from the output)

出力には2つのレコードが必要ですが、1つのレコードのみが含まれています。何が間違っているのかよくわかりません。

出力のすべてのレコードを取得する方法はありますか?

ベストアンサー1

結合キーはアルファベット順にソートする必要があります。

したがって、プロセス置換(ksh93、zsh、bash)をサポートするシェルを使用して、次のようにします。

join -1 3 -2 1 <(sort -k 3,3 1) <(sort -k 1,1 2)

またはPOSIX / Bourneシェルを使用してください。

sort -k 3,3 1 | {
  sort -k 1,1 2 | join -1 3 -2 1 /dev/fd/3 -; } 3<&0

join 仕組みを理解するのに役立ちます。joinファイルを1行ずつ同時に読み込み、結合キーを比較します。等しい場合は一致を取得し、結果を出力します。 key1 < key2の場合、key1がkey2と等しくなるまで(またはそれより大きいまでfile1を読み続けます。この場合は開始します)file2などを読み取ります。)

これは、ファイルがキーでソートされていないと機能しない理由を説明します。

joinこれは拡張を除くそれぞれのケースであり、joinGNUはキーが一致する限り文句を言いません。ただし、行がキーに基づいてソートされていない場合、他の場合と同様に、最初の不一致で失敗します。

おすすめ記事