xargs 拆分传入行

xargs 拆分传入行

我有一个文件,其中两列由空格分隔,如下所示:

potato 5
apple 7
pretzel 9

我想在每一行发出这样的命令:

cmd -f potato -n 5
cmd -f apple -n 7
cmd -f pretzel -n 9

我可以xargs拆分传入的行并将这些参数传递给命令吗?xargs这里使用的命令是否正确?

答案1

我认为你不能直接用 xargs 来做到这一点,但还有另一种解决方案:

$ cat /tmp/l
potato 5
apple 7
pretzel 9

使用 printf:

$ printf 'cmd -f %s -n %s\n' $(</tmp/l)
cmd -f potato -n 5
cmd -f apple -n 7
cmd -f pretzel -n 9

如果需要执行它,可以使用另一个管道连接到 shell,例如

$ printf 'cmd -f %s -n %s\n' $(</tmp/l) | bash

另一个简单而纯粹的 awk 解决方案:

$ awk '{print "cmd -f "$1" -n "$2}' /tmp/l
cmd -f potato -n 5
cmd -f apple -n 7
cmd -f pretzel -n 9

最后 :

$ awk '{system("cmd -f "$1" -n "$2)}' /tmp/l

答案2

如果你有 GNU Parallelhttp://www.gnu.org/software/parallel/安装后你可以这样做:

cat food.txt | parallel --colsep ' ' cmd -f {1} -n {2}

它还将cmd每个 CPU 核心并行运行一个。

您可以通过以下方式轻松安装 GNU Parallel:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

观看 GNU Parallel 的介绍视频以了解更多信息: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

相关内容