使用 gnu parallel 替换 csh 数组/命令

使用 gnu parallel 替换 csh 数组/命令

首先,是的,被锁定在 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>"

提前致谢!!

答案1

写一个脚本。从 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>

相关内容