【问题标题】:Is there a unix command line utilty for 'mapping' by line?是否有用于按行“映射”的 unix 命令行实用程序?
【发布时间】:2026-02-06 13:25:02
【问题描述】:

我有一个输入流,我想“映射”到输出行。例如,如果我的输入流是文件 nums,我想要这种语法

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

相当于

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

【问题讨论】:

    标签: linux unix command-line utilities


    【解决方案1】:

    使用 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
    

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

    【讨论】:

      【解决方案2】:

      我认为xargs 最接近你假设的map

      cat nums | xargs -n1 ./myscript
      

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

      cat nums | xargs -I ARG ./myscript ARG
      

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

      【讨论】:

      • 具体来说,我有一个文本文件,其中大多数行是 IP 地址,对于每一行,我想执行一个 wget 命令并将该行文本替换为来自 wget 的响应文本。
      • 啊,酷!我不知道你可以使用-n1 开关来限制每行的参数数量。
      • 您可能还想查看 GNU parallel,它不是标准的 UNIX 实用程序,但类似于 xargs:en.wikipedia.org/wiki/Parallel_(software)
      【解决方案3】:
      #!/bin/bash
      while read -r line
      do
        "$@" <<< "$line"
      done
      

      【讨论】:

      • 确实,一个简单的脚本就可以完成我所说的。不过,我很好奇是否存在命令行实用程序。
      【解决方案4】:

      您可以使用 bash 脚本来执行此操作。比如:

      #!/bin/bash
      
      string="| ./myscript"
      
      echo "9534 $string"
      echo "2343 $string"
      echo "1093 $string"
      echo "7023 $string"
      

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

      【讨论】:

      • 我知道,但我希望有一种方法可以逐行解析。
      • 我知道曾经有一些老式的基于文本的命令行游戏,它们的功能与您所说的类似。另外,我想,VI 和 EMACS 必须能够做你想做的事情。