【问题标题】:unix functions inside perlperl 中的 unix 函数
【发布时间】:2013-10-28 21:01:14
【问题描述】:

我尝试在 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 命令中使用该变量...

如果您能指出我可以更改以使其工作的地方,请告诉我。非常感激。

【问题讨论】:

  • 你可能知道 shell 脚本,但这不是好的做法:永远不要解析 ls 的输出是一个人应该学习的第一件事!亲爱的,您将美丽的语言 (Perl) 与最糟糕的 shell 脚本实践混合在一起! (无意冒犯)。
  • 您能解释一下您的脚本应该做什么吗?
  • 我有100多个文件夹,每个文件夹中有n个文件。我想对每个文件夹做同样的事情,就是将其中的文件合并起来,对合并后的文件进行排序,然后使用bedtools合并重叠区域(生物信息学中很常见的做法)

标签: perl bash shell unix


【解决方案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`;

【讨论】:

    【解决方案2】:

    要在 shell 中使用 perl 变量,这是一个示例:

    #!/usr/bin/env perl
    
    my $var = "/etc/passwd";
    
    my $out = qx(file $var);
    
    print "$out\n";
    

    对于其余的,它非常混乱。你应该花时间学习 perl,而不是把 coreutils 命令和 Perl 混在一起,因为 perl 本身是一个更好的工具。

    【讨论】:

      【解决方案3】:

      好的。我放弃了 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-08
        相关资源
        最近更新 更多