我尝试在perl驱动程序脚本中使用一些unix工具,因为我对编写shell脚本知之甚少。我的目的是将几个简单的unix命令组合在一起,这样我就可以在一个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命令中使用该变量......
请告诉我是否可以指出我可以更改的位置以使其正常工作。非常感激。
答案 0 :(得分: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`;
答案 1 :(得分:0)
要在shell中使用perl变量,这是一个示例:
#!/usr/bin/env perl
my $var = "/etc/passwd";
my $out = qx(file $var);
print "$out\n";
对于其他人来说,它非常混乱。你应该花时间学习perl而不是混合coreutils命令和Perl,其中perl本身是一个更好的工具来完成整个笑话。
答案 2 :(得分:0)
行。我在perl上放弃了它,并决定尝试使用shell脚本。有效!! 谢谢你的上述答案!
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