POSIXを使用して2つのソートされていないファイルをリンクしますか? [コピー]

POSIXを使用して2つのソートされていないファイルをリンクしますか? [コピー]

入るから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/joinjoinsort

$ 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つしかない場合にシェルが分岐しない一般的な最適化を防ぐためです。)

おすすめ記事