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

Unix 将文件的部分管道化到需要多个输入的命令,unix,pipe,Unix,Pipe,在Unix shell中执行某些操作时,我通常希望将一个文件的一部分通过管道传输到特定命令,例如: cut -f1 file1 | perl -pe 's/foo/bar/' 我喜欢这样,因为这意味着我不必为file1的第1列创建一个完整的其他文件 不过,当我想执行一个接收多组输入(如join)的命令时,我会遇到问题。我希望我能做些像这样的事情: join (cut -f1 file1) (cut -f1 file2) 有没有什么方法可以很好地做到这一点,而不创建不必要的文件 也许这是: j

在Unix shell中执行某些操作时,我通常希望将一个文件的一部分通过管道传输到特定命令,例如:

cut -f1 file1 | perl -pe 's/foo/bar/'
我喜欢这样,因为这意味着我不必为file1的第1列创建一个完整的其他文件

不过,当我想执行一个接收多组输入(如join)的命令时,我会遇到问题。我希望我能做些像这样的事情:

join (cut -f1 file1) (cut -f1 file2)
有没有什么方法可以很好地做到这一点,而不创建不必要的文件

也许这是:

join <(cut -f1 file1) <(cut -f1 file2)
假设您使用的是bash作为shell,不过…

可能是这样的:

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

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

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

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

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

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

您正在使用管道重定向到stdin;因为只有一个标准DIN,所以这种方式只能使用一个管道。如果您想要更多管道,则需要使用命名管道(也称为FIFO)

i、 e


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

您正在使用一个管道重定向到stdin;因为只有一个标准DIN,所以这种方式只能使用一个管道。如果您想要更多管道,则需要使用命名管道(也称为FIFO)

i、 e


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

之后是否必须删除管道1和管道2?如果不再需要,您可以直接将其移除;否则它们会持续存在,您可以将它们用于其他命令。对于一般情况,这可能是更好的解决方案。您是否必须在以后删除pipe1和pipe2?如果不再需要它们,您可以直接将它们rm;否则它们会一直存在,您可以将它们用于其他命令。对于一般情况,这可能是更好的解决方案