Skripte parallel ausführen, einen Satz nach dem anderen, und dabei die Hauptdatei aufteilen?

Skripte parallel ausführen, einen Satz nach dem anderen, und dabei die Hauptdatei aufteilen?

Ich habe eine Datei abc.txtwie 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

verwandte Informationen