1

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

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

我喜欢这个,因为这意味着我不必只为file1.

但是,当我想要执行一个接受多组输入的命令时遇到问题,例如join. 我希望我能做类似的事情:

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

有没有办法在不创建不必要的文件的情况下很好地做到这一点?

4

3 回答 3

4

也许是这样:

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

假设您使用bash的是外壳,但是...

于 2013-06-21T20:00:01.967 回答
3

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

IE

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

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

于 2013-06-21T20:02:27.650 回答
0

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

awk 'NR==FNR {a[NR]=$1; next} {print a[FNR], $1}' file1 file2
于 2013-06-21T20:01:12.547 回答