Ich habe ein Skript s1
, das eine Liste von Zahlen ausgibt, die durch ',' getrennt sind, z 1,2,3,4
. Jetzt möchte ich diese Zahlen dem Skript s2
als Argumente geben, damit s2 auf jedem von ihnen ausgeführt wird und das Ergebnis in einer separaten Zeile ausgibt. Wenn zum Beispiel s2 Zahlen mit zwei multipliziert, ist dies das Ergebnis, nach dem ich suche:
2
4
6
8
Was ich gerade mache ist:
s1 | xargs -d "," | xargs -n1 s2
Aber ich habe das Gefühl, dass ich es so dumm mache! Meine Frage lautet also:
Was ist der richtige Weg, um es zu tun?
Mein Problem mit meiner Lösung ist, dass es xargs zweimal aufruft und zweimal über die Eingabe iteriert, was für meine Augen natürlich aufgrund der Leistung nicht vernünftig ist! Die Antwort xargs -d "," -n1
scheint nett zu sein, aber ich bin mir nicht sicher, ob sie nur einmal wiederholt wird. Wenn dies der Fall ist, überprüfen Sie dies bitte in Ihrer Antwort, und ich werde es akzeptieren. Übrigens würde ich Perl lieber nicht verwenden, da es immer noch zweimal iteriert und Perl auf vielen Systemen möglicherweise nicht vorhanden ist.
s1 | xargs -d "," -n1 s2
Antworten:
Dies sollte auch funktionieren:
Testfall:
Ergebnis:
Wenn
s1
diese Liste gefolgt von einem Zeilenumbruchzeichen ausgegeben wird, möchten Sie sie entfernen, da sonst der letzte Aufruf4\n
statt4
:quelle
Wenn Sie
s2
mehrere Argumente akzeptieren können, können Sie Folgendes tun:Dies überschreibt IFS vorübergehend als Komma, alles in einer Unterschale, sodass
s2
die Ausgabe vons1
durch Kommas getrennt wird. Die Unterschale ist eine Kurzform zum Ändern von IFS, ohne den vorherigen Wert zu speichern oder zurückzusetzen.Eine frühere Version dieser Antwort war falsch, wahrscheinlich aufgrund einer verbleibenden IFS-Einstellung, die die Ergebnisse beschädigte. Vielen Dank an ilkkachu für den Hinweis auf meinen Fehler .
Um die Ausgänge manuell zu durchlaufen und einzeln bereitzustellen
s2
, wird hier das Speichern und Zurücksetzen von IFS demonstriert:oder führen Sie die IFS-Bits wie zuvor in einer Subshell aus:
quelle
bash -c 'IFS=, printf "%s\n" $(echo 1,2,3)'
druckt1,2,3
auf meinem System, dh es gibt keine Aufteilung./usr/bin/printf
und/bin/echo
(IFS=,; printf "%s\n" $(echo 1,2,3))
sollte dies funktionieren.Versuche dies:
quelle
tr ',' '\n'
? Keine Notwendigkeit, etwas so (relativ) Schweres wie Perl und reguläre Ausdrücke aufzurufen.