是否存在用于按行“映射”的unix命令行实用程序?

时间:2012-03-26 23:29:37

标签: linux unix command-line utilities

我有一个输入流,我想" map"输出线。例如,如果我的输入流是文件nums,我想要这个语法

$ cat nums
9534
2343
1093
7023
$ cat nums | map ./myscript $0

等同于

$ echo 9534 | ./myscript
$ echo 2343 | ./myscript
$ echo 1093 | ./myscript
$ echo 7023 | ./myscript

4 个答案:

答案 0 :(得分:5)

我认为xargs与您的假设map最接近:

cat nums | xargs -n1 ./myscript

cat nums | xargs -n1 -J ARG ./myscript ARG

cat nums | xargs -I ARG ./myscript ARG

不幸的是,xargs不允许您调用从stdin读取的内容,因此您必须重写脚本以接受命令行参数而不是从stdin读取。

答案 1 :(得分:3)

#!/bin/bash
while read -r line
do
  "$@" <<< "$line"
done

答案 2 :(得分:0)

您可以使用bash脚本执行此操作。类似的东西:

#!/bin/bash

string="| ./myscript"

echo "9534 $string"
echo "2343 $string"
echo "1093 $string"
echo "7023 $string"

或者,您可以使用数值轻松填充数组,并在一个循环中完成所有操作。

答案 3 :(得分:0)

使用GNU Parallel,它看起来像:

$ 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

作业将并行运行(每个核心一个作业),直到所有作业完成。