通常在我的 Unix shell 中做一些事情时,我想将一个文件的一部分通过管道传递给一个特定的命令,例如:
cut -f1 file1 | perl -pe 's/foo/bar/'
我喜欢这个,因为这意味着我不必只为file1
.
但是,当我想要执行一个接受多组输入的命令时遇到问题,例如join
. 我希望我能做类似的事情:
join (cut -f1 file1) (cut -f1 file2)
有没有办法在不创建不必要的文件的情况下很好地做到这一点?
也许是这样:
join <(cut -f1 file1) <(cut -f1 file2)
假设您使用bash
的是外壳,但是...
您正在使用管道重定向到标准输入;因为只有一个标准输入,你只能用这种方式做一个管道。如果您想要更多管道,则需要使用命名管道(又名 fifos)
IE
mkfifo pipe1 pipe2
cut -f1 file1 > pipe1 &
cut -f1 file2 > pipe2 &
join pipe1 pipe2
cut 命令将一直阻塞,直到连接开始读取它们的输出,因为管道不是可以包含数据的真实文件;只是名称以允许多个管道。
您可以改为使用 awk 来获得类似的输出:
awk 'NR==FNR {a[NR]=$1; next} {print a[FNR], $1}' file1 file2