Есть ли команда командной строки unix для "сопоставления" по строке?

У меня есть входной поток, и я хочу "сопоставить" с выводами. Например, если мой входной поток был файлом 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 ответа

Я думаю, что xargs является самым близким к вашему гипотетическому map:

cat nums | xargs -n1 ./myscript

или

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

или

cat nums | xargs -I ARG ./myscript ARG

К сожалению, xargs не позволяет вам ссылаться на вещи, которые читаются из stdin, поэтому вам придется переписать свой script, чтобы принять аргумент командной строки, а не читать из stdin.


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


С 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

Работы будут выполняться параллельно (одно задание на ядро) до тех пор, пока не будут выполнены все задания.


Для этого вы можете использовать bash script. Что-то вроде:

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

Или вы можете легко заполнить массив своими численными значениями и просто сделать это все в одном цикле.

licensed under cc by-sa 3.0 with attribution.