运行 bash 中不同列上的不同管道

run different pipelines on different column in bash

我有一个包含文本消息的文件:1 行 = 一条消息。为了清理消息,我有一个管道,我可以像这样 运行:

cat file | ./clean.sh

但是现在,我需要在一个文件上做同样的事情,其中​​每条消息都与一个 ID 相关联,所以我的新文件是这种形式的:

678 message1
456 message2
479 message3
...

列以制表符分隔。但是我不能 运行 它上面的 clean.sh 脚本,因为 ID + 选项卡将被清理器删除(并且由于某些原因我无法修改 clean.sh 脚本)。

如何在不修改 ID 的情况下创建清理消息的管道?或者,我如何才能 运行 仅针对特定列的管道?

我需要的输出是:

678 cleaned(message1)
456 cleaned(message2)
479 cleaned(message3)
...

编辑:

我最后做的是使用 FIFO 特殊文件,这样一切都保持在管道中:

mkfifo col1 col2
tee > (cut -f1 > col1) > (cut -f2 | ./clean.sh > col2) > /dev/null;
paste -d'\t' col1 col2

cutpaste。制表符分隔文件很容易。

cut -f1 file > file1
cut -f2- file | clean.sh > file2
paste file1 file2 > clean-file

对于输入流版本,这是作弊吗?

... | | (cat > foo ; paste <(cut -f1 foo) <(cut -f2- foo | ./clean.sh))

类似于@mob 的回答,但使用进程替换而不是临时文件:

paste $<(cut -f1 file) $<(cut -f2- file | clean.sh)

如果输入是流而不是文件,您可以逐行读取它并在每一行调用clean.sh

cat file | while read -r num line; do
    echo "$num" "$(echo "$line" | clean.sh)"
done