1

perl スクリプトの使用を並列化しようとしています。perl スクリプトの入力引数と出力引数は、ディレクトリからファイル名を取得します。これは、gnu parallel を使用すると簡単です。

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

ただし、スクリプトの追加の引数では、各ファイルから最初の行と最後の行、2 番目の列の値を取得する必要があります...

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

私自身の解決策は、GNU パラレルに渡される bash スクリプトでしたが、上記の 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 に答える