我有一个输入流,想要将其“映射”到输出行。例如,如果我的输入流是文件 nums,则我希望使用以下语法:
$ cat nums
9534
2343
1093
7023
$ cat nums | map ./myscript $0
将等同于
$ echo 9534 | ./myscript
$ echo 2343 | ./myscript
$ echo 1093 | ./myscript
$ echo 7023 | ./myscript
我有一个输入流,想要将其“映射”到输出行。例如,如果我的输入流是文件 nums,则我希望使用以下语法:
$ cat nums
9534
2343
1093
7023
$ cat nums | map ./myscript $0
将等同于
$ echo 9534 | ./myscript
$ echo 2343 | ./myscript
$ echo 1093 | ./myscript
$ echo 7023 | ./myscript
我认为xargs
是最接近你假设的map
的东西:
cat nums | xargs -n1 ./myscript
或者
cat nums | xargs -n1 -J ARG ./myscript ARG
或者
cat nums | xargs -I ARG ./myscript ARG
很遗憾,xargs
无法调用读取标准输入的命令,因此您需要重写脚本以接受命令行参数而不是从stdin读取。
#!/bin/bash
while read -r line
do
"$@" <<< "$line"
done
#!/bin/bash
string="| ./myscript"
echo "9534 $string"
echo "2343 $string"
echo "1093 $string"
echo "7023 $string"
或者,您可以轻松地用数字值填充一个数组,并在一个循环中完成所有操作。
$ cat nums | parallel -N1 --pipe ./myscript
这相当于
$ echo 9534 | ./myscript
$ echo 2343 | ./myscript
$ echo 1093 | ./myscript
$ echo 7023 | ./myscript
或者你可以这样做:
$ cat nums | parallel ./myscript
这相当于
$ ./myscript 9534
$ ./myscript 2343
$ ./myscript 1093
$ ./myscript 7023
这些作业将并行运行(每个核心一个作业),直到所有作业完成。
xargs
:http://en.wikipedia.org/wiki/Parallel_(software) - Kristopher Johnson