入るからjoin
ソートする必要があり、通常、コマンドは次のように呼び出されます。
join <(sort file1) <(sort file2)
これはPOSIXで指定されていないプロセス置換を使用するため、移植性はありません。
join
-
標準入力は、ファイルパラメータの1つとして指定することもできます。ただし、これはソートのみを許可します。一つパイプファイル:
sort file1 | join - <(sort file2)
両方のファイルを並べ替えてから、POSIX指定関数のみを使用して結果をリンクする簡単な方法が必要です。 3番目のファイル記述子にリダイレクトを使用するか、FIFOを生成することもできます。しかし、私はそれを想像するのは難しいです。
join
ソートされていないファイルにPOSIXlyを使用する方法は?
ベストアンサー1
2つの名前付きパイプを使用してこれを実行できます(または名前付きパイプ1つとstdinを使用することもできます)。
mkfifo a b
sort file1 > a &
sort file2 > b &
join a b
プロセスの交換は、デフォルトで/dev/fd/
これらのfifoを設定することで機能します(使用可能な場合は名前付きパイプを使用)。たとえば、bashでは:
$ echo join <(sort file1) <(sort file2)
join /dev/fd/63 /dev/fd/62
ファイル名で呼び出すときにbashがどのように開いているかを確認してください(.(新しいzsh、bash、およびksh93バージョンは/dev/fd
そうでない場合は名前付きパイプを使用します))。したがって、ファイルが開くと、両方が保存されます。移動するのを見ることができます。いくつかのlsofトリックを介して:/dev/fd/
join
join
sort
$ sh -c 'lsof -a -d 0-999 -p $$; exit' <(sort file1) <(sort file2)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sh 1894 anthony 0u CHR 136,5 0t0 8 /dev/pts/5
sh 1894 anthony 1u CHR 136,5 0t0 8 /dev/pts/5
sh 1894 anthony 2u CHR 136,5 0t0 8 /dev/pts/5
sh 1894 anthony 62r FIFO 0,10 0t0 237085 pipe
sh 1894 anthony 63r FIFO 0,10 0t0 237083 pipe
(これは、exit
実行するコマンドが1つしかない場合にシェルが分岐しない一般的な最適化を防ぐためです。)