【发布时间】:2015-07-02 20:17:03
【问题描述】:
我有一个包含文本消息的文件: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
【问题讨论】:
-
您可以使用
awk或perl或类似方法就地执行此操作(尽管为了简单起见,它可能需要至少每行运行一次清理程序)。如果您可以将文件拆分为列,然后重新加入,这会使事情变得更容易(您可以使用awk或cut拆分并使用paste加入)。