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