9

これは架空の質問にすぎません-実際の問題を解決するものではありません-bashを学習するだけです。

コマンドを使用すると、tee次のように、出力をより多くの異なるストリームに分割できます。

command1 | tee >(commandA1 | commandA2 >file1) >(commandB1 | commandB2 >file2) >file0

グラフィカルに次のように行われます

                  ---commandA1---commandA2--> file1
                 /
command1---tee-------> file0
                 \
                  ---commandB1---commandB2--> file2

さて、pasteコマンドで例えば

paste file1 file2 | command3

ただし、次のような別のプログラムからの貼り付け出力にリダイレクトできます。

paste <(ls) <(ls) | command3

問題は、次のように、2 つのストリームを 1 つに結合できるかどうかです。

                  ---commandA1---commandA2---
                 /                           \
command1---tee-------> file0                  --- paste---command3
                 \                           /
                  ---commandB1---commandB2---

PS:中間ファイルなしを意味します...

4

1 に答える 1

4

名前付きパイプでそれを行う方法は次のとおりです。

trap "rm -f /tmp/file1 /tmp/file2; exit 1" 0 1 2 3 13 15
mkfifo /tmp/file1
mkfifo /tmp/file2
command1 | tee >(commandA1 | commandA2 >/tmp/file1) >(commandB1 | commandB2 >/tmp/file2) >file0
paste /tmp/file1 /tmp/file2 | command3
rm -f /tmp/file1 /tmp/file2
trap 0

作業例:

$ cd -- "$(mktemp -d)" 
$ trap "rm -f pipe1 pipe2; exit 1" 0 1 2 3 13 15
$ mkfifo pipe1 pipe2
$ printf '%s\n' 'line 1' 'line 2' 'line 3' 'line 4' | tee \
>(sed 's/line /l/' | head -n 2 > pipe1) \
>(sed 's/line /Line #/' | tail -n 2 > pipe2) \
> original.txt
$ paste pipe1 pipe2 | sed 's/\t/ --- /'
l1 --- Line #3
l2 --- Line #4
$ rm pipe1 pipe2
$ trap 0
于 2013-06-25T00:38:58.630 に答える