消除数据集中的一些行

时间:2011-08-18 04:57:18

标签: perl loops next

我正急于从我的数据集中获取一些内容。

#!/usr/local/bin/perl
use Date::Calc qw(Add_Delta_Days); 
my @just_ecps;
my @folder_dates;
my @ecp_dot_tee_array = `grep ISLAND ~/data/files/grit.t`;
foreach (@ecp_dot_tee_array){
      ($ecp, undef, undef, undef, undef, undef) = split (/\s+/, $_);
         push (@just_ecps, $ecp);
}
for ($h = 1; $h <= 5; $h++){

   my (undef, undef, undef, $day, $month, $year) = localtime();
   $year+=1900;
   $month+=1;
   ($year, $month, $day) = Add_Delta_Days($year, $month, $day, -$h );
   if ($month < 10 ){
      $month = "0$month";
   }
   if ($day < 10 ){
      $day = "0$day";
   }
push (@folder_dates, "$year$month$day");
}

for ( $j=0; $j <=$#just_ecps ; $j++){
   for ($x=0; $x<=$#folder_dates ; $x++){
      open FILEHANDLE , "zmore /data/ibprod/archive/$folder_dates[$x]/$just_ecps[$j]  /ghistogram.gz | ";
      @archive_average = (<FILEHANDLE>);
      foreach $line(@archive_average){
         if ($line =~ /ave:\s+(\d+\.\d+)\s/){
            print $1;
            sleep 1;
            print "\n";
         }
      }
   }
}

这是我运行程序时得到的 - 我试图得到'无法读取&gt;数据集之外的文件

% ./read_in_ghistogram2
0.00414601
0.0044511
0.00387373
/usr/bin/zmore: line 52: /home/data/archive/20110814/islnd1/ghistogram.gz: No such  file or directory
/usr/bin/zmore: line 52: /home/data/archive/20110813/islnd1/ghistogram.gz: No such file or directory
0.00309721
0.00302753
0.00307702
/usr/bin/zmore: line 52: /home/data/archive/20110814/islnd2/ghistogram.gz: No such file or directory
/usr/bin/zmore: line 52: /home/data/archive/20110813/islnd2/ghistogram.gz: No such file or directory 
0.00324729
0.00295381
0.00301736
/usr/bin/zmore: line 52: /home/data/archive/20110814/islnd3/ghistogram.gz: No such file or directory
/usr/bin/zmore: line 52: /home/data/archive/20110813/islnd3/ghistogram.gz: No such file or directory

我尝试将它们从while循环中过滤掉,但是它不起作用,并且程序中的第52行不是,它只会转到42

for ( $j=0; $j <=$#just_ecps ; $j++){
   for ($x=0; $x<=$#folder_dates ; $x++){
      #print "/home/ibprod_archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz";
      open FILEHANDLE , "zmore /data/archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz | ";
      while (<FILEHANDLE>) {
          next if ($_ =~ '/No such file or directory/');
          push (@archive_average,$_);
          foreach $line(@archive_average){
             if ($line =~ /\save:\s+(\d+\.\d+)\s/){
               print $line;
               sleep 1;
             }
         }
      }
   }

1 个答案:

答案 0 :(得分:2)

Line 52引用zmore脚本中的行,而不是perl脚本中的行。

要解决您的问题,请先测试perl脚本中是否存在该文件,然后再将其移交给其他人。

my $archive = "/data/archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz";
next unless (-r $archive);

-r检查文件是否存在且当前用户是否可读。所以next unless (-r $file)将转到循环的下一次迭代,除非该文件存在且可读。

(这很有趣 - 如果在您尝试阅读这些文件时某些内容正在删除(或更改所有权),open仍然可能会失败。如果这不是安全敏感的话,那就不是太多了担心,但记住这一点。)

两个提示:

  • zmore旨在供人类使用,而不是脚本。如果输出是分页的,那么脚本不关心一点。因此,您应该使用gunzip -c $file(如果您没有gzip -cd,则可能使用gunzip,但不确定该open
  • 始终检查close是否成功,否则您将尝试在某个时刻操纵无效的文件句柄,这会导致更多错误。始终my $archive = "/data/archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz"; next unless (-r $archive); if (!open(FILEHANDLE, "<", "gunzip -c $archive|")) { print STDERR "Error processing $archive: $!\n"; # optional next; } while (<FILEHANDLE>) { ... } close FILEHANDLE; 你打开了什么。

所以我将你的脚本改为:

zmore

最后,正在向STDERR打印/dev/null错误消息。如果您只想隐藏这些消息(而不是修复它们),只需将其重定向到日志文件(或% ./read_in_ghistogram2 2> errors.log ):

{{1}}