
私は次のように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はキーが一致する限り文句を言いません。ただし、行がキーに基づいてソートされていない場合、他の場合と同様に、最初の不一致で失敗します。
答え2
私の考えでは、これがバグかもしれませんjoin
。次のバージョンを使用してFedora 14で試しましたjoin
。
$ join --version
join (GNU coreutils) 8.5
はい
$ join -1 3 -2 1 1 2
8058 work1 a 51 77-11:29:32 /apps/sas
15336 work2 b 51 100-12:23:49 /local/hotfix
選ぶ
以下を使用できますawk
。
$ awk 'NR==FNR{_[$3]=$3;next}$1 in _{print _[$1],$0}' 1 2
8058 8058 77-11:29:32 /apps/sas
15336 15336 100-12:23:49 /local/hotfix