使用GNU parallel将文件名和文件内容参数传递给perl脚本

时间:2013-09-06 10:53:32

标签: perl awk arguments gnu-parallel

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

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脚本使用它?

看着

Change text in argument for xargs (or GNU Parallel)

正确的方法是这样做吗?

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

谢谢。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

你想要的并不是很清楚。如果不是这样,那么请给我们一个完整的输入和所需输出的例子。

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您的命令行会爱你。

答案 2 :(得分:0)

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

这是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的激励洞察力。我也应该关注自己的老帖子。

Storing text and numeric variable from file to use in perl script