通常在我的Unix shell中做一些事情时,我想将一个文件的一部分传递给特定的命令,例如:
cut -f1 file1 | perl -pe 's/foo/bar/'
我喜欢这个,因为这意味着我不必为file1
的第1列提供完整的其他文件。
但是,当我想要执行一个包含多组输入的命令(例如join
)时,我会遇到问题。我希望我能做一些像:
join (cut -f1 file1) (cut -f1 file2)
有没有办法在不创建不必要的文件的情况下很好地完成这项工作?
答案 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