Csh
csh 數組/命令替換與 gnu 並行
首先,是的,鎖定在 Solaris 機器上的 csh 中,對此無能為力,抱歉。
我有一個使用 foreach 循環執行的報告批處理。現在它作為單執行緒執行,我想用 GNU 並行加速它。我一直在嘗試兩種不同的方法,但每種方法都遇到了障礙。
這是我目前的版本:
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
所以我想讓它與並行工作,但正如你所看到的,我有大量的命令擴展/替換正在進行。
我嘗試了幾種不同的方法,包括製作一個傳遞給reportcli的字元串數組,但我不知道如何讓它發揮得很好。
在我看來,我有兩個選擇:
A)一大行(必須解決所有引用問題才能使 gdate 命令替換工作):
`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)事先組裝一個csh數組,然後嘗試擴展數組(用echo擴展?),管道到並行
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
我知道我的數組很好,因為我可以這樣做並取回每個元素:
foreach j ($CMDLIST:q) echo $j end
但是,我不確定如何讓它在 csh 中工作:
echo $CMDLIST | parallel --pipe "reportcli <cli params here>"
提前致謝!!
寫一個腳本。從 GNU Parallel 呼叫它:
[... set $START and $COUNT ...] seq $COUNT | parallel my_script.csh $START {}
我的腳本.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>