使用末尾带有额外参数的管道。正确引导具有多个参数的管道指令

使用末尾带有额外参数的管道。正确引导具有多个参数的管道指令

一般说明

我遇到过几次同样的问题,我通过一步一步的脚本解决了这个问题。但我知道有了烟斗、单线会让我的生活变得更轻松。

简单地:

command1 -flag target.file | command2 -flag 

据我了解,command2应用于 的输出command1 -flag target.file。然而,command2有一个额外的参数必须在最后添加。因此,它可以读作:

command2 -flag OUTPUTOFCOMMAND1 argument2

当我尝试直接使用管道时|,当然我没有得到所需的命令,因为它将输出传递到第二条指令的末尾。我想将管道输出重定向到第二条指令的特定部分。像这样的东西:

command1 -flag target.file | command2 -flag PIPEOUTPUT1HERE argument2

我在这里发现了类似的问题:将上一个命令的输出作为参数传递给下一个命令,但我想要一个更通用、更简单的方法。正如我所使用的,但没有成功:

command1 | xargs -I{} command2 {}

这基本上是在做command2 $(command1),但我想通过管道传输它的整个输出。就像一个简单的ls | grep "something"

我的具体案例:

我想取出 dat 文件的第一行,并将其分割为每 11 行:

$ tail -n +2 ac_sweep_m+_-30.00mT.rx | xargs -I{} split -l 2 {} 

但在第二条指令末尾传递前一个输出的每一行:

"ac_sweep_m+_-30.00mT_"              
split: cannot open '0.000000e+00 0.000363094 -0.000518363 -0.000389763 0 ' for reading: No such file or directory
split: cannot open '2.800000e-11 -0.0853443 -0.00230621 -0.000370474 0 ' for reading: No such file or directory
split: cannot open '6.700000e-11 -0.205325 -0.00375738 0.000241809 0 ' for reading: No such file or directory

如何才能将管道准确地引导到特定位置?

答案1

解决方案比我想象的要简单:

去做这个:

command1 -flag target.file | command2 -flag PIPEOUTPUT1HERE argument2

仅用于-正确引导输出第一个命令的:

command1 -flag target.file | command2 -flag - argument2

就我而言,它工作得很好。剪切 dat 文件的第一行,并将文件分割成每行 21 行的部分:

$ tail -n +2 ac_sweep_m+_-30.00mT.rx | split -l 21 - "ac_sweep_m+_-30.00mT_"
$ ls
ac_sweep_m+_-30.00mT_aa  ac_sweep_m+_-30.00mT_ae  ac_sweep_m+_-30.00mT_ai  ac_sweep_m+_-30.00mT_am  ac_sweep_m+_-30.00mT_aq  
ac_sweep_m+_-30.00mT_ab  ac_sweep_m+_-30.00mT_af  ac_sweep_m+_-30.00mT_aj  ac_sweep_m+_-30.00mT_an  ac_sweep_m+_-30.00mT_ar

相关内容