1

私は、次世代シーケンシングイルミナデータの分析のために、さまざまなスクリプトと入力パラメーターを一緒にパイプすることを含むバイオインフォマティクスプロジェクトに取り組んでいます。ラッパースクリプトについてサポートが必要です。ラッパーは、システムコマンドまたはユーティリティを埋め込んだシェルスクリプトであり、一連のパラメータを受け入れてそのコマンドに渡すことを思い出してください。複雑なコマンドラインでスクリプトをラップすると、スクリプトの呼び出しが簡単になります。

コードの最小限の表現は次のとおりです。

#!/usr/bin/perl
use strict; use warnings;

my $barcode_file= shift;
unless($barcode_file){
    die "missing barcode file location, aborting.\n";
}

my $raw_data_location = '/data/local/samples/';
my $components_location= '~/read_cleanup/';
my $tmp_dir= '/tmp/';

open (FILEIN, $barcode_file) or die "couldn't open $barcode_file for read: $!\n";

while(<FILEIN>){
# input file format (tab delimited):
# Sample_Name    barcode    enzyme    size    paired    seq_file

    /^$/ and next; chomp;

    my ($sample, $barcode, $enzyme, $size, $pe, $seq_file)= split;

    $raw_file_data = "${raw_data_location}$seq_file"; #/data/local/samples/301.fq for instance

    # final output file
    my $final_output_file = "${tmp_dir}${sample}_reconciled_ends.fq"; # /tmp/D1_reconciled_ends.fq for instance

    # if the sample is paired ( 1 - paired, 0 - unpaired)
    if ($pe) {
        my $pipe_cmd= "${components_location}script01.pl $raw_data_file $barcode | ${components_location}script02.pl $enzyme | ${components_location}script03.pl  $size > $final_output_file";
    }
    system($pipe_cmd);

# at this point, $final_output_file should be saved in the
# tmp folder and contain the paired fastq data output

}
close (FILEIN);

基本的に、ラッパーはbarcode.txtファイルを読み取り、ファイルの各行(サンプル名)をループします。サンプル名ごとに、パイプ実行の各スクリプトの入力パラメーターが生成されます。サンプルがペアデータの場合、パイプ実行を実行します。配管スキームは次のようになります。

# the input parameters are "fed" into the script and the output is piped
# as STDIN to the next script.
script01.pl [input parameters] | script02.pl [input parameters] | script03.pl [input parameters] > file.txt

system($piped_cmd)ターミナルでパイプ実行を実行します。

ターミナルからラッパースクリプトを実行しようとすると、問題が発生します。

./wrapper_example.pl barcode.txt

次のエラーメッセージが返されます。

sh: 1: /home/user/read_cleanup/script01.pl: not found

誰かが何が悪いのか、これを修正する方法を知っていますか?ありがとう。どんな提案でも大歓迎です。

4

2 に答える 2

1

さて、system()構文はsystem("$command","$args1","$args2")ORsystem(@command)です@command=("$command","$arg1","$arg2")。私はむしろバックティックを使用して、次のようなコマンドのチェーン全体を実行したいと思います-

if ($pe) {
    `perl ${components_location}script01.pl $raw_data_file $barcode | perl ${components_location}script02.pl $enzyme | perl ${components_location}script03.pl  $size > $final_output_file`;
}
于 2012-07-18T01:27:42.403 に答える
0

ほとんどの場合、/ home / user / read_cleanup / script01.plが実行可能ファイルではないか、そのシバン(で始まる最初の行#!)が間違ったPerlを指しています。もう少し詳細がなければ、さらにトラブルシューティングするのは難しいです。

于 2012-07-17T22:30:46.670 に答える