
Ich habe eine Datei abc.txt
wie diese auf einem Linux-Rechner:
abc|yes|50c|1|pending
bcd|no|100c|1|pending
cde|yes|45c|2|pending
def|no|44c|2|pending
Ich habe diese Datei basierend auf dem 4. Feld in zwei Dateien aufgeteilt 1.txt
.:
abc|yes|50c|1|pending
bcd|no|100c|1|pending
Und2.txt
cde|yes|45c|2|pending
def|no|44c|2|pending
Wenn das zweite Feld „ja“ ist, möchte ich ein Skript mit dem 3. Feld als Parameter aufrufen, oder wenn das zweite Feld „nein“ ist, das 1. Feld als Parameter, und die Skripte parallel ausführen. 1.txt sollte ausgeführt werden, dann 2.txt, und wenn ein Skript fehlschlägt, sollte es das letzte Feld von „Ausstehend“ auf „FEHLERHAFT/ERFOLGREICH“ aktualisieren. (Mein Skript gibt den Rückgabecode „0 – Erfolgreich, 1 – Fehlgeschlagen“ aus.)
Zum Beispiel:
1.txt
ksh script1.ksh 50c
ksh script1.ksh bcd
2.txt
ksh script1.ksh 45c
ksh script1.ksh def
Antwort1
#!/bin/bash
runksh() {
ksh script1.sh "$1";
}
export -f runksh
doit() {
parallel --joblog +my.log --colsep '\|' \
runksh '{=1 $_ = $arg[2] eq "yes" ? $arg[3] : $arg[1] =}' {};
}
export -f doit
parallel -u --colsep '\|' -j1 --group-by 3 --pipepart -a abc.txt doit
# my.log now contains whether a job succeeded or failed
# Extract exit code + argument
awk -e '$7 != 0 { print $11"|"$12"|"$13"|"$14"|FAILED"; }' my.log > failed
awk -e '$7 == 0 { print $11"|"$12"|"$13"|"$14"|SUCCEEDED"; }' my.log > succeeded
cat failed succeeded