Csh

csh 數組/命令替換與 gnu 並行

  • August 3, 2015

首先,是的,鎖定在 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>

引用自:https://unix.stackexchange.com/questions/219963