在 Korn shell 中循环遍历 Rscript 中的不同参数

loop through different arguments in Rscript within Korn shell

我有一个 R 脚本,我 运行 在终端中使用它首先生成一个名为 myscript.ksh 的 .ksh 文件,其中包含以下信息:

#!/bin/ksh

Rscript myscript.R 'Input1'

然后 运行 带有

的函数
./mycode.ksh

它将脚本发送到我们部门集群上的一个节点(我们发送到集群的进程必须是.ksh 文件)。

'Input1' 是 R 脚本用于某些分析的输入参数。

我现在遇到的问题是我需要 运行 这个脚本多次使用函数的不同输入参数。一种解决方案是生成几个 .ksh 文件,例如:

#!/bin/ksh

Rscript myscript.R 'Input2'

#!/bin/ksh

Rscript myscript.R 'Input3'

然后分别执行,但我希望找到更好的解决方案。

请注意,我必须对 100 个不同的输入参数执行此操作,因此编写 100 个这样的文件是不现实的。有没有一种方法可以生成另一个文件,其中包含需要提供给函数的信息,例如'Input1' 'Input2' 'Input3' 然后 运行 myscript.ksh 分别用于这些。

例如,我可以有一个定义输入参数名称的变量,然后有一个循环将它传递给 myscript.ksh。那可能吗?

之所以 运行 以这种方式连接这些是希望每次迭代都可以发送到集群上的不同节点,从而以更快的速度分析数据。

你需要做两件事:

  1. 创建一个包含所有输入变量的数组
  2. 遍历数组并发起所有调用

下面说明了这个概念:

#!/bin/ksh

#Create array of inputs - space separator 
inputs=(Input1 Input2 Input3 Input4)

# Loop through all the array items {0 ... n-1}
for i in {0..3}
do
   echo ${inputs[i]}
done

这将输出输入数组中的所有值。

您只需要将 do-loop 的内容替换为:

Rscript myscript.R ${inputs[i]}

此外,您可能需要在 Rscript 命令行的末尾添加一个“&”,以将每个 Rscript 命令作为一个单独的线程生成——否则,shell 将等待 return 从每个 Rscript 命令开始,然后再进入下一个命令。


编辑:

根据您的意见,您需要实际生成 .ksh 脚本以提交给 qsub。为此,您只需要扩展 do 循环。

例如:

#!/bin/ksh

#Create array of inputs - space separator 
inputs=(Input1 Input2 Input3 Input4)

# Loop through all the array items {0 ... n-1}
for i in {0..3}
do
   cat > submission.ksh << EOF
       #!/bin/ksh

       Rscript myscript.R ${inputs[i]}
EOF

   chmod u+x submission.ksh

   qsub submission.ksh
done

EOF 定义将作为输入 (STDIN) 的开始和结束,输出 (STDOUT) 将写入 submission.ksh。

然后使用 chmod 命令使 submission.ksh 可执行。

然后通过qsub提交脚本。我会让你填写 qsub.

所需的任何其他参数

如果您的脚本在启动时不知道所有参数,您可以使用以下信息制作一个名为 mycode.ksh 的 .ksh 文件:

#!/bin/ksh

if [ $# -ne 1 ]; then
   echo "Usage: [=10=] input"
   exit 1
fi
# Or start at the background with nohup .... &, other question
Rscript myscript.R ""

然后是 运行 函数 ./mycode.ksh 输入X

当您的应用程序知道所有参数时,您可以使用循环:

#!/bin/ksh
if [ $# -eq 0 ]; then
   echo "Usage: [=11=] input(s)"
   exit 1
fi
for input in $*; do
   Rscript myscript.R "${input}"
done

然后 运行 函数

./mycode.ksh input1 input2 "input with space in double quotes" input4