0

シェルスクリプトの書き方についてほとんど知らなかったので、perl ドライバースクリプト内でいくつかの UNIX ツールを使用しようとしました。私の目的は、いくつかの単純な UNIX コマンドを組み合わせて、1 つの perl コマンドで 100 個のディレクトリに対してスクリプトを実行できるようにすることです。

タスクは、100 個を超えるフォルダーがあり、各フォルダーに n 個のファイルがあることです。各フォルダーで同じことをしたいです。つまり、それらのファイルを結合し、結合したファイルを並べ替え、bedtools を使用して重複領域を結合します (バイオインフォマティクスでは非常に一般的な方法です)。

ここに私が持っているものがあります:

#!/usr/bin/perl -w
use strict;

my $usage ="
This is a driver script to merge files in each folder into one combined file
";
die $usage unless @ARGV;

my ($in)=@ARGV;
open (IN,$in)|| die "cannot open $in";

my %hash;
my $final;

while(<IN>){
    chomp;
    my $tf = $_;
    my @array =`ls $tf'/.'`;
    my $tmp;
    my $tmp2;
    foreach my $i (@array){
        $tmp = `cut -f 1-3 $tf'/'$i`;
        $tmp2 = `cat $tmp`;
    }
    my $tmp3;
    $tmp3=`sort -k1,1 -k2,2n $tmp2`;
    $final = `bedtools merge -i $tmp3`;
}
print $final,"\n";

この行がまったく機能していないことはわかっています..

$tmp2 = `cat $tmp`;

問題は、出力を perl の別の変数に送信し、後でその変数を別の UNIX コマンドで使用する方法です...

どこを変更して機能させることができるかを指摘できるかどうか教えてください。大変感謝しています。

4

3 に答える 3

1

通常、バッククォートからの出力には改行が含まれており、通常は出力を下流で使用する前に削除する必要があります。コードにを追加chompします。

chomp( my @array =`ls $tf'/.'` );

my $tmp;
my $tmp2;
foreach my $i (@array){
    chomp( $tmp = `cut -f 1-3 $tf'/'$i` );
    chomp( $tmp2 = `cat $tmp` );
}
my $tmp3;
chomp( $tmp3=`sort -k1,1 -k2,2n $tmp2` );
$final = `bedtools merge -i $tmp3`;
于 2013-10-28T21:07:47.780 に答える
0

わかった。私は perl でそれをあきらめ、シェル スクリプトを使用して試してみることにしました。出来た!!上記の回答をありがとう!

for dir in `ls -d */`
do
    name=$(basename $dir /)
    cd $dir
    for file in `ls`
    do
        cut -f 1-3 $file > $file.tmp
    done
    for x in `ls *tmp`
    do
        cat $x >> $name.tmp1
    done
    sort -k1,1 -k2,2n $name.tmp1 > $name.tmp2
    bedtools merge -i $name.tmp2 > $name.combined
done
于 2013-10-28T21:33:41.230 に答える
0

シェルで perl 変数を使用する場合の例を次に示します。

#!/usr/bin/env perl

my $var = "/etc/passwd";

my $out = qx(file $var);

print "$out\n";

残りは非常に面倒です。時間をかけて perl を学習し、coreutils コマンドと Perl を混ぜないようにする必要があります。perl 自体が冗談全体を行うためのより優れたツールです。

于 2013-10-28T21:05:01.580 に答える