有没有一个Unix命令行实用程序可以按行进行“映射”?

6

我有一个输入流,想要将其“映射”到输出行。例如,如果我的输入流是文件 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个回答

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读取。


具体来说,我有一个文本文件,其中大多数行都是IP地址,对于每个IP地址,我想执行一个wget命令,并用wget的响应文本替换该行文本。 - Robert Martin
啊,太酷了!我不知道你可以使用“-n1”开关来限制每行参数的数量。 - Robert Martin
1
你可能还想看看GNU Parallel,它不是标准的UNIX实用程序,但类似于xargs:http://en.wikipedia.org/wiki/Parallel_(software) - Kristopher Johnson

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

确实,一个简单的脚本就可以做到我所说的。不过,我很好奇是否存在命令行实用程序。 - Robert Martin

0
你可以使用Bash脚本来完成这个任务。类似于:
#!/bin/bash

string="| ./myscript"

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

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


我知道,但我希望有一种按行解析的方法。 - Robert Martin
我知道以前有一些基于文本的命令行游戏,做了你所说的事情。此外,我想VI和EMACS应该能够满足你的需求。 - john_science

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接