Ich weiß, wie man das Ergebnis verschiedener Befehle kombiniert
paste -t',' <(commanda) <(commandb)
Ich kenne die gleiche Eingabe zu verschiedenen Befehlen
cat myfile | tee >(commanda) >(commandb)
Wie kann man nun diesen Befehl kombinieren? Damit ich es tun kann
cat myfile | tee >(commanda) >(commandb) | paste -t',' resulta resultb
Angenommen, ich habe eine Datei
meine Datei:
1
2
3
4
Ich möchte eine neue Datei erstellen
1 4 2
2 3 4
3 2 6
4 1 8
ich benutzte
cat myfile | tee >(tac) >(awk '{print $1*2}') | paste
würde mir das Ergebnis vertikal geben, wo ich sie wirklich in horizontaler Reihenfolge einfügen möchte.
Antworten:
Wenn Sie zu mehreren Prozessersetzungen wechseln, wird nicht garantiert, dass Sie die Ausgabe in einer bestimmten Reihenfolge erhalten. Halten Sie sich also besser daran
Angenommen, es
cat myfile
steht für eine teure Pipeline, dann müssen Sie die Ausgabe entweder in einer Datei oder in einer Variablen speichern:Anhand Ihres Beispiels:
Ein anderer Gedanke: FIFOs und eine einzelne Pipeline
quelle
Die
yash
Shell verfügt über einzigartige Funktionen ( Pipeline-Umleitung und Prozessumleitung ), die dies dort einfacher machen:3>>|4
( Pipeline-Umleitung ) Erstellt eine Pipe, bei der sich das Schreibende auf fd 3 und das Leseende auf fd 4 befindet.3>(commanda>&3)
ist eine Prozessumleitung , ein bisschen wie eine ksh / zsh / bash-Prozessersetzung, führt jedoch nur die Umleitung durch und ersetzt sie nicht durch die/dev/fd/n
.ksh
's>(cmd)
ist mehr oder weniger dasselbe wieyash
' sn>(cmd) /dev/fd/n
(esn
gibt einen Dateideskriptor, vonksh
dem Sie keine Kontrolle haben).quelle
Mit
zsh
:Dann verwenden als:
Dies ist aus dieser anderen Frage übernommen, in der Sie einige detaillierte Erklärungen und Hinweise zu den Einschränkungen finden (Vorsicht vor Deadlocks!).
quelle
Für Ihr spezielles Beispiel sollte es keine Notwendigkeit geben
paste
und der Rest. Es ist oft richtig, dass wenn wir mit dem Standard-Toolset auf eine Grenze stoßen, dies daran liegt, dass das, was wir auf eine Weise tun möchten, auf eine andere Weise getan werden kann. Sowie:... was druckt ...
Sie können eine Datei mit Inhalten, die Sie erwähnen, in Ihr Shell-
"$@"
Array wie ...Und um die arg-Werte in einer Schleife wie der obigen zu validieren, können Sie den anfänglichen Test ein wenig ändern ...
... der nur dann einen Fehler an stderr ausgibt, wenn eine mit eingelesene Zeile eine Zeile
set -- $(cat)
enthält, die nicht vollständig aus einer einzelnen Ganzzahl besteht.quelle