将文件的一部分管道化为需要多个输入的命令

时间:2013-06-21 19:50:37

标签: unix pipe

通常在我的Unix shell中做一些事情时,我想将一个文件的一部分传递给特定的命令,例如:

cut -f1 file1 | perl -pe 's/foo/bar/'

我喜欢这个,因为这意味着我不必为file1的第1列提供完整的其他文件。

但是,当我想要执行一个包含多组输入的命令(例如join)时,我会遇到问题。我希望我能做一些像:

join (cut -f1 file1) (cut -f1 file2)

有没有办法在不创建不必要的文件的情况下很好地完成这项工作?

3 个答案:

答案 0 :(得分:4)

也许这就是:

join <(cut -f1 file1) <(cut -f1 file2)

假设您使用bash作为shell,但是......

答案 1 :(得分:3)

您正在使用管道重定向到标准输入;因为只有一个标准输入,所以你只能这样做一个管道。如果你想要更多管道,你需要使用命名管道(又名fifos)

mkfifo pipe1 pipe2
cut -f1 file1 > pipe1 &
cut -f1 file2 > pipe2 &
join pipe1 pipe2

剪切命令将阻塞,直到连接开始读取它们的输出,因为管道不是可以包含数据的真实文件;只是允许多个管道的名称。

答案 2 :(得分:0)

您可以使用awk来获得类似的输出:

awk 'NR==FNR {a[NR]=$1; next} {print a[FNR], $1}' file1 file2