首页 > 解决方案 > Shell中的不同程序如何处理数据流中的不同列?

问题描述

假设我有一个流,其中包含三列数据,并\t作为分隔符。

要处理流中的数据,后面的两列需要由 处理prog1,而第一列连同prog1(1 列) 的输出将由 处理prog2

考虑到两者都prog1需要prog2启动时间,重复启动程序是不可接受的。因此,以下代码段并不能真正解决问题:

IFS='\t'  # C-v tab
while read c0 c1 c2; do
  paste <(echo ${c0}) <(echo -e"${c1}\t${c2}" | prog1) | prog2
done </dev/stdin

任何线索或提示将不胜感激。

标签: shell

解决方案


下面的东西?

# create a temporary fifo
fifo=$(mktemp -u)
mkfifo "$fifo"
# split and get first column
tee >(cut -f1 >"$fifo") |
  # extract 2,3 column and pass to prog1
  cut -f2,3 | prog1 |
  # join with first column
  paste "$fifo" - |
  prog2

推荐阅读