2012-03-26 14 views
5

Mam strumień wejściowy i chcę "mapować" do linii wyjściowych. Na przykład, jeśli strumień wejściowy były pliki nums, chciałbym, że ta składniaCzy istnieje wiersz poleceń UNIX do "mapowania" po linii?

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

byłoby równoważne

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

Odpowiedz

5

myślę xargs jest najbliższa rzecz do hipotetycznego map:

cat nums | xargs -n1 ./myscript 

lub

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

lub

cat nums | xargs -I ARG ./myscript ARG 

Niestety xargs nie pozwala powołać rzeczy czytane ze standardowego wejścia, więc musisz przerobić skrypt, aby zaakceptował argument wiersza poleceń, zamiast czytania ze standardowego wejścia.

+0

W szczególności mam plik tekstowy, w którym większość linii jest adresem IP, i dla każdego chcę wykonać polecenie wget i zastąpić ten wiersz tekstu tekstem odpowiedzi z wget. –

+0

Ah, fajnie! Nie wiedziałem, że możesz użyć przełącznika '-n1', aby ograniczyć liczbę argumentów w linii. –

+0

Możesz również chcieć spojrzeć na GNU równoległe, które nie jest standardowym narzędziem UNIX, ale jest podobne do 'xargs': http://en.wikipedia.org/wiki/Parallel_(software) –

0

Można użyć skryptu bash, aby to zrobić. Coś jak:

#!/bin/bash 

string="| ./myscript" 

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

Lub, można łatwo wypełnić tablicę z wartościami liczbowymi i po prostu robić to wszystko w jednej pętli.

+0

Wiem, ale liczyłem na sposób, aby przeanalizować wiersz. –

+0

Wiem, że były stare, oparte na tekście gry z wiersza poleceń, które miały coś wspólnego z tym, o czym mówisz. Ponadto, jak przypuszczam, VI i EMACS muszą być w stanie robić to, co się chce. – theJollySin

3
#!/bin/bash 
while read -r line 
do 
    "[email protected]" <<< "$line" 
done 
+0

Rzeczywiście, prosty skrypt rób to, o czym mówię. Byłem jednak ciekawy, czy istnieje narzędzie wiersza poleceń. –