1

我正在尝试并行使用 perl 脚本。perl 脚本的输入和输出参数从目录中获取文件名。这对于 gnu 并行很简单。

ls dir | parallel script.pl --input {} --output {.}.out

但是,脚本中的一个附加参数要求我从每个文件中获取第一行和最后一行,第二列的值......类似于

ls dir | parallel script.pl --input {} --output {.}.out --otherargs range:{1}-{2}

其中 {1} 和 {2} 派生自先前/同时使用 awk 或 sed 来获取这些值,例如

awk 'NR==1 {print $2}; END {print $2}' 

但是我在哪里放置(如何放置)这个 awk 之类的步骤在“工作流程”中以允许 perl 脚本使用它?

看着

更改 xargs(或 GNU Parallel)的参数中的文本

正确的方法就是这样做吗?

ls | parallel script.pl --input {} --output {.}.out --otherargs range:{1}-{2} :::: <(awk 'NR==1 {print $2}) <(awk 'END {print $2})

谢谢你。

4

3 回答 3

2

目前还不清楚你想要什么。如果不是这样,那么请给我们一个完整的输入示例和想要的输出。

ls | parallel script.pl --input {3} --output {3.}.out --otherargs range:{1}-{2} :::: <(ls | awk 'NR==1 {print $2}') <(ls | awk 'END {print $2}') -

或者:

parallel script.pl --input {3} --output {3.}.out --otherargs range:{1}-{2} :::: <(ls | awk 'NR==1 {print $2}') <(ls | awk 'END {print $2}') <(ls)

浏览教程http://www.gnu.org/software/parallel/parallel_tutorial.html您的命令行会因此而爱上您。

于 2013-09-06T19:04:40.937 回答
1

这可能是您需要的解决方案:

#!/bin/bash
readarray -t LIST < <(ls)
FIRST=${LIST[0]}; LAST=${LIST[@]:(-1)}
printf '%s\n' "${LIST[@]}" | parallel script.pl --input {} --output {.}.out --otherargs "range:${FIRST}-${LAST}"

运行它作为bash script.sh. 也许你需要运行排序?<(ls | sort). 我认为即使你有不同的来源,这个概念也会随之$FIRST而来$LAST

使用临时文件的类似概念:

ls > temp
FIRST=$(awk 'NR==1 {print $2}' temp)
LAST=$(awk 'END {print $2}' temp}
parallel script.pl --input {} --output {.}.out --otherargs "range:${FIRST}-${LAST}" < temp

此外,我认为这是您真正需要的 awk 命令:

{read -r FIRST; read -r LAST;} < <(awk 'NR==1{print $2;next}{t=$2};END{print t}' temp)
于 2013-09-06T11:31:56.183 回答
0

我自己的解决方案是一个 bash 脚本,传递给 GNU paralle,但上面的 Ole 更优雅(一个 GNU 并行单行).....收集相关变量并将它们传递给 perl 脚本的 bash 脚本。在 GNU 中并行运行此脚本。

这是bash脚本

#!/bin/bash
sample=$1
describer=$(echo ${sample} | sed 's/.sync//') # removes .sync suffix
a=($(awk 'NR==1 {print $2}' ${sample}))
b=($(awk 'END {print $2}' ${sample}))

perl script.pl --input ${describer}.sync --output ${describer}.genepop  
--argument scaffold_1:$a-$b  

其次是

ls | parallel bash bash.script.sh

这使得从文件中收集变量成为文件分析的一部分。

感谢您提供启发性的见解 konsolebox。我也应该关注我自己的旧帖子。

从文件中存储文本和数字变量以在 perl 脚本中使用

于 2013-09-07T16:37:46.830 回答