我有一个文件,其中两列由空格分隔,如下所示:
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