2011-08-18 98 views
0

我正试图从我的数据集中取出一些行。从数据集中删除一些行

#!/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"; 
     } 
     } 
    } 
} 

这是我所得到的,当我运行程序 - 我试图得到“无法读取>文件出的数据集

% ./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 

我试图筛选出来的同时循环,但它不工作,并且疗法是不是在程序行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; 
      } 
     } 
     } 
    } 
+0

感谢Quintin的我很感激 – capser

回答

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; 

最后被打印到STDERR的zmore错误消息。如果你想要做的是隐藏这些消息(而不是将它们固定),简单地重定向到一个日志文件(或/dev/null):

% ./read_in_ghistogram2 2> errors.log 
+0

我的老板指示我用命令zmore,所以我非常喜欢gunzip -c。 – capser

+0

我还没有运行代码 - 我确定我明白'不是!'在开放声明前面....谢谢 – capser

+0

'open'如果成功则返回'0',否则返回非零。在布尔上下文中'0'为假,'!0'为真。所以'打开(...)'是真的如果打开失败。 – Mat