9

STDIN で次の入力例があるとします。

foo
bar bar
baz
===
qux
bla
===
def
zzz yyy

区切り文字 (この場合は「===」) で分割し、標準入力を介して並行して実行されているコマンドにフィードすることは可能ですか?

したがって、上記の入力例は、次のように、各インスタンスが STDIN でデータの一部を受信する 3 つの並列プロセス (たとえば、do.sh というコマンド) になります。

do.sh (インスタンス 1) は、STDIN 経由でこれを受け取ります。

foo
bar bar
baz

do.sh (インスタンス 2) は、STDIN 経由でこれを受け取ります。

qux
bla

do.sh (インスタンス 3) は、STDIN 経由でこれを受け取ります。

def
zzz yyy

xargs または GNU parallel を使用すると、このようなことが可能だと思いますが、その方法はわかりません。

4

3 に答える 3

13

GNU Parallel はバージョン 20110205 からそれを行うことができます。

cat | parallel --pipe --recend '===\n' --rrs do_stuff
于 2011-01-11T14:26:39.070 に答える
3

一般的に、いいえ。この評価の理由の 1 つは、端末ではなくファイルからの標準 I/O 読み取りがデータのブロックを読み取るためです。一度に BUFSIZ バイトです。ここで、BUFSIZ は通常、512 などの 2 の累乗以上です。データがファイル内にある場合、1 つのプロセスが表示されているファイル全体を読み取ります。他のプロセスは、同じ開いているファイルの説明を共有している場合は何も表示しません (ファイル記述子に似ていますが、複数のファイル記述子が同じ開いているファイルの説明を共有できます。異なるプロセスにある可能性があります)、またはそれらが同じ開いているファイルの説明を共有していない場合は、同じファイル全体を読み取ります。

したがって、3 つのプロセスに情報を分割する必要があることを認識しているファイルを読み取るプロセスが必要です。また、3 つのプロセスに接続する方法を認識している必要があります。ディストリビューター プログラムが 3 つのプロセスを実行し、それらの個別のパイプ入力に書き込む可能性があります。または、ディストリビューターが 3 つのソケットに接続し、異なるソケットに書き込みを行っている可能性があります。

あなたの例では、マーカーで区切られた 37 のセクションがある場合に何が起こるかを示したり説明したりしていません。

tpipeUnixコマンドに似た自作プログラムteeがありますが、標準入力(のすべて)のコピーを各プロセスに書き込み、デフォルトで標準出力にも書き込みます。これは、必要なものの適切な基礎になる可能性があります (少なくとも、プロセス管理の部分をカバーしています)。コピーが必要な場合は、私に連絡してください - 私のプロフィールを見てください。


Bash を使用している場合は、正規teeのプロセス置換を使用してシミュレートできますtpipe。方法の図については、この記事を参照してください。

同じ情報の別のバージョンについては、 SF 96245も参照してください。さらに、 (基本的な考え方は同じですが、さまざまな点で実装がわずかに異なります)peeと呼ばれるプログラムへのリンクも参照してください。tpipe

于 2011-01-11T14:37:05.330 に答える
1

名前付きパイプを使用してこれを行うことができます。名前付きパイプを使用すると、標準のパイプをファイルとして扱うことができます。複数の名前付きパイプを使用して、他のプログラムにそれらを処理させることができます。

私は名前付きパイプにあまり詳しくありませんが、このような状況で時々使用してきました。

于 2011-01-11T16:34:20.917 に答える