Bash

拆分不同命令的輸入並組合結果

  • January 11, 2016

我知道如何組合不同命令的結果

paste -t',' <(commanda) <(commandb)

我知道管道相同的輸入到不同的命令

cat myfile | tee >(commanda) >(commandb)

現在如何組合這些命令?這樣我就可以做到

cat myfile | tee >(commanda) >(commandb) | paste -t',' resulta resultb

說我有一個文件

我的文件:

1
2
3
4

我想做一個新文件

1 4 2
2 3 4
3 2 6
4 1 8

我用了

cat myfile | tee >(tac) >(awk '{print $1*2}') | paste

會給我垂直的結果,我真的想按水平順序粘貼它們。

當您進行多個流程替換時,不能保證以任何特定順序獲得輸出,因此您最好堅持使用

paste -t',' <(commanda < file) <(commandb < file)

假設cat myfile代表一些昂貴的管道,我認為您必須將輸出儲存在文件或變數中:

output=$( some expensive pipeline )
paste -t',' <(commanda <<< "$output") <(commandb <<< "$output")

使用您的範例:

output=$( seq 4 )
paste -d' ' <(cat <<<"$output") <(tac <<<"$output") <(awk '$1*=2' <<<"$output")
1 4 2
2 3 4
3 2 6
4 1 8

另一個想法:FIFO 和單個管道

mkfifo resulta resultb
seq 4 | tee  >(tac > resulta) >(awk '$1*=2' > resultb) | paste -d ' ' - resulta resultb
rm resulta resultb
1 4 2
2 3 4
3 2 6
4 1 8

引用自:https://unix.stackexchange.com/questions/183356