기본 파일 그룹을 그룹별로 분할하려면 스크립트를 병렬로 실행하시겠습니까?

기본 파일 그룹을 그룹별로 분할하려면 스크립트를 병렬로 실행하시겠습니까?

abc.txtLinux 시스템에 다음과 같은 파일이 있습니다.

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

네 번째 필드를 기준으로 파일을 두 개의 파일로 분할했습니다. 1.txt:

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

그리고2.txt

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

두 번째 필드가 "예"인 경우 세 번째 필드를 매개 변수로 사용하고, 두 번째 필드가 "아니요"인 경우 첫 번째 필드를 매개 변수로 사용하여 스크립트를 병렬로 실행하는 스크립트를 호출하고 싶습니다. 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

관련 정보