一般说明:
我遇到过几次同样的问题,我通过一步一步的脚本解决了这个问题。但我知道有了烟斗、单线会让我的生活变得更轻松。
简单地:
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