2011-08-18 75 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