Primeiro de tudo, sim, bloqueado em csh em uma caixa do Solaris, não posso fazer nada sobre isso, desculpe.
Eu tenho um lote de relatórios em execução usando um loop foreach. No momento, ele é executado como um único encadeamento e eu gostaria de acelerá-lo com o GNU paralelo. Eu tenho tentado duas abordagens diferentes, mas atingindo barreiras em cada uma delas.
Aqui está a minha versão atual:
if( $#argv <= 1) then
#Get today's date
set LAST = 'gdate +%Y-%m-%d'
else
#use date passed in parameter
set LAST='echo $2 | tr -d _/';
endif
if( $#argv == 0 ) then
#default to 15 day lookback
set COUNT = 15
else
#otherwise use parameter
set COUNT = $1
endif
@ LCOUNT = $COUNT + 1 #increment by one to exclude $LAST date
#get starting date by subtracting COUNT (now incremented by 1)
set START = "'gdate --date='$LAST -$LCOUNT day' +%Y/%m/%d'";
#loop through dates, generate report string, and pipe to reportcli
foreach i ('seq $COUNT')
set REPDATE = "'gdate --date='$START +$i day' +%Y/%m/%d'";
set FILEDATE = "'gdate --date='$START +$i day' +%Y%m%d'";
echo "runf reportname.rep -ps "$REPDATE" -pe "$REPDATE" -o report_"$FILEDATE".csv" \
| reportcli <cli params here>
end
Então, gostaria de fazer isso funcionar em paralelo, mas, como você pode ver, tenho uma grande quantidade de expansão / substituição de comandos acontecendo.
Eu tentei algumas abordagens diferentes, incluindo fazer uma matriz da string passada para o reportcli, mas não consigo descobrir como fazer isso funcionar legalmente.
A meu ver, tenho duas escolhas:
A) uma grande linha (tem que resolver todos os problemas de cotação para fazer com que a substituição do comando gdate funcione):
'seq $COUNT' | parallel reportcli <cli params> < "runf reportname.rep -ps \
'gdate --date='$START +{} day' +%Y/%m/%d' -pe 'gdate --date='$START +{} day' +%Y/%m/%d' \
-o report_'gdate --date='$START +${} day' +%Y%m%d'.csv"
B) Montar uma matriz csh antecipadamente, em seguida, tentar expandir a matriz (expandir com eco?), tubo para paralelo
set CMDLIST
foreach i ('seq $COUNT')
set REPDATE = "'gdate --date='$START +$i day' +%Y/%m/%d'";
set FILEDATE = "'gdate --date='$START +$i day' +%Y%m%d'";
set CMDLIST = ($CMDLIST:q "runf reportname.rep -ps "$REPDATE" -pe "$REPDATE" \
-o report_"$FILEDATE".csv")
end
Eu sei que minha matriz é boa porque posso fazer isso e recuperar cada elemento:
foreach j ($CMDLIST:q)
echo $j
end
mas não sei como fazer isso funcionar no csh:
echo $CMDLIST | parallel --pipe "reportcli <cli params here>"
Obrigado antecipadamente !!