运行 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
cut
和 paste
。制表符分隔文件很容易。
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
我有一个包含文本消息的文件: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
cut
和 paste
。制表符分隔文件很容易。
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