2011-02-02 27 views
1

我有幾個數據文件是製表符分隔的。我需要提取這些數據文件某一列中的所有唯一值(比如第25列),並將這些值寫入輸出文件以供進一步處理。我該如何在Perl中執行此操作?記住我需要考慮同一個文件夾中的多個文件。從Perl中的多個文件中提取唯一值

編輯:我到目前爲止所做的代碼就是這樣。

#!/usr/bin/perl     

use warnings; 
use strict; 

my @hhfilelist = glob "*.hh3"; 

for my $f (@hhfilelist) { 
    open F, $f || die "Cannot open $f: $!"; 
    while (<F>) { 
    chomp; 
    my @line = split /\t/; 

    print "field is $line[24]\n"; 
    } 
    close (F); 
} 

的問題是我怎麼有效地創造獨特價值的散列/陣列,因爲我讀的每個文件的每一行。或者,如果我填充整個數組然後刪除重複項,速度會更快嗎?

+0

@davorg嗯,我很堅持的基本問題本身。首先,我如何一次讀取多個文件。下一個僅在我讀取每個文件時考慮獨特的值。我猜可以使用Find :: File包。 – sfactor 2011-02-02 12:17:58

+0

@DVK yes是已經在Perl中的較大代碼的一部分。 – sfactor 2011-02-02 12:19:55

+0

您通常不應該使用split來分析X分隔的文件。除了最微不足道的情況外,這還不夠 - 例如不處理字段中的X(分隔符),或者引用的字段。雖然 – DVK 2011-02-02 15:50:32

回答

2
perl -F/\\t/ -ane 'print"$F[24]\n" unless $seen{$F[24]}++' inputs > output 

perl -F/\\t/ -ane 'print"$F[24]\n" unless $seen{$F[24]}++' *.hh3 > output 

命令行開關-F/\\t/ -an意味着通過在每一個輸入文件中的每個線迭代和分裂上的標籤字符行成陣列@F

$F[24]指值中的每一行(24個和第25個製表符之間)的25個字段

$seen{...}是保持其已經觀測值軌道哈希表。 第一次觀察到值時,$seen{VALUE}爲0,因此Perl將執行語句print"$F[24]\n"。每隔一段時間觀察該值,$seen{VALUE}將不爲零,並且語句不會執行。這樣每個唯一的值就會被打印出來一次。


在類似的情況下,以你的更大的腳本:

my @hhfilelist = glob "*.hh3"; 
my %values_in_field_25 =(); 
for my $f (@hhfilelist) { 
    open F, $f || die "Cannot open $f: $!"; 
    while (<F>) { 
    my @F = split /\t/; 
    $values_in_field_25{$F[24]} = 1; 
    } 
    close (F); 
} 

my @unique_values_in_field_25 = keys %values_in_field_25; # or sort keys ... 
3

對於Perl解決方案,請使用Text::CSV模塊解析平面(X分隔)文件 - 構造函數接受指定分隔符的參數。執行此操作在一個循環中的每個文件,通過任一​​3210在給定的目錄中的文件或File::Find子目錄以及

然後生成的文件列表,以獲得獨特的價值觀,對於每一行,存儲列#25散列。

E.g.檢索值後:

$colref = $csv->getline($io); 
$unique_values_hash{ $colref->[24] } = 1; 

然後,迭代散列鍵並打印到文件。


對於非Perl的外殼的解決方案,你可以簡單地做:

cat MyFile_pattern | awk -F'\t' 'print $25' |sort -u > MyUniqueValuesFile 

您可以cut

更換awk請注意,非Perl的解決方案僅適用如果文件唐」 t在字段本身中包含TAB,並且列未被引用。

3

對如何處理這個問題的一些提示:

  • 查找文件
    • 對於目錄中查找文件,使用globglob '.* *'
    • 對於目錄樹中查找文件,使用File::Find「 s find功能
  • 打開每個文件,使用Text::CSV\t字符作爲分隔符,提取希望的值並寫入文件
相關問題