csh array / substituição de comando com gnu parallel

1

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

    
por cmcapellan 03.08.2015 / 18:57

1 resposta

0

Escreva um script. Chame isso de GNU Parallel:

[... set $START and $COUNT ...]

seq $COUNT | parallel my_script.csh $START {}

my_script.csh:

#!/bin/csh

set START = $1
set i = $2

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>
    
por 03.08.2015 / 20:39