メイン ファイルを分割して、スクリプトを 1 セットずつ並列に実行しますか?

メイン ファイルを分割して、スクリプトを 1 セットずつ並列に実行しますか?

abc.txtLinux マシン上に次のようなファイルがあります:

abc|yes|50c|1|pending
bcd|no|100c|1|pending
cde|yes|45c|2|pending
def|no|44c|2|pending

このファイルを 4 番目のフィールドに基づいて 2 つのファイルに分割しました。1.txt:

abc|yes|50c|1|pending
bcd|no|100c|1|pending

そして2.txt

cde|yes|45c|2|pending
def|no|44c|2|pending

2 番目のフィールドが「はい」の場合は、3 番目のフィールドをパラメータとしてスクリプトを呼び出し、2 番目のフィールドが「いいえ」の場合は、1 番目のフィールドをパラメータとしてスクリプトを呼び出し、スクリプトを並列に実行します。1.txt が実行され、次に 2.txt が実行され、いずれかのスクリプトが失敗した場合は、最後のフィールドが保留から失敗/成功に更新されます。(私のスクリプトは、0 は成功、1 は失敗の戻りコードを渡します)

例えば:

1.txt

ksh script1.ksh 50c
ksh script1.ksh bcd

2.txt

ksh script1.ksh 45c
ksh script1.ksh def

答え1

#!/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

関連情報