2016-09-26 71 views
0

在這裏工作是我的腳本的一部分:ZCAT在命令行,但不是在perl腳本

foreach $i (@contact_list) { 

    print "$i\n"; 

    $e = "zcat $file_list2| grep $i"; 
    print "$e\n"; 

    $f = qx($e); 
    print "$f";          
} 

$e打印正常,但$f給人即使$file_list2$i匹配一個空行。

有誰能告訴我爲什麼?

+0

那編輯總結應該閱讀「將代碼添加到答案時請注意減價」。另外,歡迎來到Stack Overflow。 – simbabque

+1

什麼是變數?你爲什麼不使用'zgrep'? – tripleee

+0

如果輸入數據很大(如壓縮格式所示),那麼一次完成所有匹配似乎是一個更好的方法。 – tripleee

回答

0

始終是更好地使用,而不是使用管道Perl的grep的:

@lines = `zcat $file_list2`; # move output of zcat to array 
die('zcat error') if ($?);  # will exit script with error if zcat is problem 
# chomp(@lines)     # this will remove "\n" from each line 

foreach $i (@contact_list) { 

    print "$i\n"; 

    @ar = grep (/$i/, @lines); 
    print @ar; 
# print join("\n",@ar)."\n";  # in case of using chomp 
} 

最好的辦法是不是要求用zcat,但使用zlib庫: http://perldoc.perl.org/IO/Zlib.html

use IO::Zlib; 

# .... 
# place your defiiniton of $file_list2 and @contact list here. 
# ... 

$fh = new IO::Zlib; $fh->open($file_list2, "rb") 
    or die("Cannot open $file_list2"); 
@lines = <$fh>; 
$fh->close; 

#chomp(@lines);     #remove "\n" symbols from lines 
foreach $i (@contact_list) { 

    print "$i\n"; 
    @ar = grep (/$i/, @lines); 
    print (@ar); 
# print join("\n",@ar)."\n"; #in case of using chomp 
} 
0

你的問題讓我們猜測許多事情,但更好的整體方法似乎只打開一次文件,並在Perl本身處理每一行。

open(F, "zcat $file_list |") or die "$0: could not zcat: $!\n"; 
LINE: 
while (<F>) { 
    ######## FIXME: this could be optimized a great deal still 
    foreach my $i (@contact_list) { 
     if (m/$i/) { 
      print $_; 
      next LINE; 
     } 
    } 
} 
close (F); 

如果你想從內環更排擠,編譯從@contact_list的正則表達式爲循環之前一個單獨的數組,或者將它們組合成一個單一的正則表達式,如果所有你關心的是,是否其中之一匹配。另一方面,如果您希望只在最後知道它們是什麼時纔打印一個模式的所有匹配項,請將匹配項按每個搜索表達式收集到一個數組中,然後將它們循環並在您清理整組輸入時進行打印文件。

如果沒有關於$i中的內容的信息,您的問題是無法重現的,但我可以猜測它包含一些shell元字符,導致它在運行grep之前由shell處理。

+0

@contact_list是一個擁有355k郵件ID的數組,我需要檢查這些郵件ID是否存在於我的數據庫中,該數據庫位於zip文件中。 所以我需要檢查這些355k郵件ID中是​​否存在不在zip文件中的每一個。此外,zip文件本身有400萬條記錄,因此我試圖避免打開它並使用zcat或zgrep –

+0

是的,因此循環搜索355k次的機會將比循環整個輸入文件355k次快得多。 – tripleee

+0

這不回答這個問題,幾乎肯定不能解決問題。 – darch

相關問題