2011-12-10 41 views
-1

我被給了一個文本文件,其中有大量數據按列排序。每列是用逗號分隔的 。如何使用Perl按列B劃分數據文件的列A

我怎樣才能將列分成另一列來打印輸出答案?我現在正在使用Perl,所以它必須在Perl中完成。我怎麼能這樣做?

這是我到目前爲止有:

#!/usr/bin/perl 

open (FILE, 'census2008.txt'); 
while (<FILE>) { 
    chomp; 
    ($sumlev, $stname,$ctyname,$popestimate2008,$births2008,$deaths2008) = split(","); 
} 
close (FILE); 
exit; 
+0

[你嘗試過什麼?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

+0

我編輯上述 – user977154

回答

1
#!/usr/bin/env perl 

# divides column 1 by column 2 of some ','-delimited file, 
# read from standard input. 
# usage: 
# $ cat data.txt | 8458760.pl 

while (<STDIN>) { 
    @values = split(/,/, $_); 
    print $values[0]/$values[1] . "\n"; 
} 
+0

後沒你剛剛做的值陣列? – user977154

+0

[是](http://www.scs.leeds.ac.uk/Perl/split.html),你爲什麼要問? – miku

+0

我只是想知道。你能解釋你的分裂功能嗎?我對此很陌生,不確定它在說什麼。 – user977154

4

有幾種選擇:

  • 讀取行','在行的文件,split列和劃分相關列(不要忘記處理除零誤差)

  • 做同樣的事情作爲一個班輪:

    $ perl -F/,/ -lane 'print($F[1] == 0 ? "" : $F[3]/$F[1])' file.txt 
    
  • 利用現成使用CPAN模塊像Text::CSV


當然,還有更多非正統/瘋狂/無法形容的替代品TMTOWTDI™,所以人們可以:

  • 解析出相關列s的正則表達式和劃分匹配:

    if (/^\d*,(\d+),\d*,(\d+)/) { say $2/$1 if $2 != 0; } 
    
  • s///e開始:

    $ perl -ple 's!^\d*,(\d+),\d*,(\d+).*$! $2 == 0 ? "" : $2/$1 !e' file.txt; 
    
  • 獲取殼裏做通過反引號骯髒的工作:

    sub print_divide { say `cat file.txt | some_command_line_command` } 
    
0

如果您有固定寬度的數據列,您可以使用'解壓縮':

#!/usr/bin/env perl 
use strict; 
use warnings; 
while (<DATA>) { 
    chomp; 
    my ($sumlev,$stname,$ctyname,$popest,$births,$deaths) 
     = unpack("A2xA10xA15xA7xA5xA5"); 
    printf "%-15s %4.2f\n", $ctyname, $births/$deaths; 
} 
__DATA__ 
10,Main  ,My City  , 10000, 200, 150 
12,Poplar ,Somewhere  , 3000, 90, 100 
13,Maple  ,Your Place  , 9123, 100, 90 
相關問題