Ich habe eine Datei mit vielen Zeilen, und in jeder Zeile habe ich die Argumente, die ich parallel mit einem Tab-Trennzeichen übergeben möchte.
Ich führe dieses Skript aus
cat $hdd_file | grep $ssd | parallel -C 't' clean_and_destroy
Und es funktioniert, $hdd_file ist der Dateiname, das grep sammelt die Zeilen, welche HDDs eine bestimmte $ssd als Cache haben, und dann ruft die Parallele eine Funktion auf, die ihre Verbindung zerstört.
Nachdem ich nun neue Partitionen zu den bereinigten SSDs erstellt habe, versuche ich, parallel so aufzurufen:
cat $hdd_file | grep $ssd | parallel -C 't' create_new_cache :::+ `seq $partitions_per_ssd`
Welches sollte die Argumente aus der Pipe holen und sie mit den angegebenen Zahlen paaren, tut es aber nicht.
cat $hdd_file | grep $ssd | parallel -C 't' create_new_cache ::: {} :::+ `seq $partitions_per_ssd`
Das habe ich auch probiert und es geht immer noch nicht. Die {} :::+ werden aus irgendeinem Grund als Argumente übergeben
Akzeptierte Antwort:
GNU parallel
Lösung:
Beispiel input.txt
(zur Demonstration):
a b
c d
e f
grep '^[ac]' input.txt
wird verwendet, um Befehle (oder Pipelines) zu emulieren, die sich wie eine Eingabequelldatei verhalten
parallel -C 't' echo :::: <(grep '^[ac]' input.txt) ::: $(seq 1 3)
Die Ausgabe:
a b 1
a b 2
a b 3
c d 1
c d 2
c d 3
:::: argfiles
–argfiles
behandeln als Eingangsquelle.:::
und::::
kann gemischt werden.
Um Elemente aus jeder Eingabequelle zu aggregieren – fügen Sie --xapply
hinzu Möglichkeit:
parallel -C 't' --xapply echo :::: <(grep '^[ac]' input.txt) ::: $(seq 1 2)
Die Ausgabe:
a b 1
c d 2