2016-02-15 68 views
0

我想用Perl腳本對文件進行數字排序。用Perl數字排序文件

我的文件看起來像如下:

1:file1:filed2 
3:filed1:field2 
10:filed1:field2 
4:field1:field2 
7:field1:field2 

我想顯示爲:上:

1:file1:filed2 
3:filed1:field2 
4:field1:field2 
7:field1:field2 
10:filed1:field2 
+0

有用的''perl'具有'sort'功能,工作起來相當不錯。 – Sobrique

+0

我在寫errr文件:open($ oErrorFileHandle,「>」。$ InputFile。「error」)||死「\ n錯誤 - >無法打開$ InputFile.error ...」;然後我嘗試使用下面的程序對上述錯誤文件進行排序:#foreach(sort <$ oErrorFileHandle>) #{0}打印$ oErrorFileHandle $ _; #} 我得到的錯誤信息如下:readline()在關閉的文件句柄符號:: GEN3在./SCOM_importOnePosMigrationId線226上。 謝謝 – puspa

+2

請[編輯]您的問題與其他細節。 (如代碼片段)。他們很難閱讀評論。 (和評論會更容易刪除) – Sobrique

回答

1

拆分和存儲在陣列中的哈希值。然後,你可以整理並打印出哈希鍵:

my %data; 

while(<DATA>){ 
    my @field = split(/:/); 
    $data{$field[0]} = [@field[1..2]]; 
} 

print join (':', $_, @{$data{$_}}) for sort { $a <=> $b } keys %data; 

print "\n"; 

1:file1:filed2 
3:filed1:field2 
4:field1:field2 
7:field1:field2 
10:filed1:field2 
+0

Thanks.But我寫我的腳本輸出到錯誤file.And我想按順序顯示我的錯誤。上面的第一個字段表示行號。我寫入錯誤文件和關閉文件。當我試圖再次閱讀它進行排序時,我在關閉的文件句柄上得到了消息readline()。Symbol :: GEN3 at ./SCOM_importOnePosMigrationId .My close命令$ oErrorFileHandle-> close(); – puspa

1

對於簡單和快速的解決方案,使用Sort::Key::Natural(快速自然排序)模塊:

use warnings; 
use strict; 

use Sort::Key::Natural qw(natsort); 

open my $fh, "<", "file.txt" or die $!; 
my @files = natsort <$fh>; 
close $fh; 
print @files; 

輸出:

1:file1:filed2 
3:filed1:field2 
4:field1:field2 
7:field1:field2 
10:filed1:field2 
1

方式sort在Perl中工作,它是通過您的列表工作,將每個元素設置爲$a$b - 然後測試這些元素。默認情況下,它使用cmp這是一種字母數字排序。

你也有<=>這是一個數字排序,你正在尋找的種類。 (阿爾法排序10之前2)。

所以我們需要做的是提取您的密鑰的數值。還有一些你可以做到這一點的方式 - 將明顯的是採取一個子程序暫時複製變量:

#!/usr/bin/env perl 
use strict; 
use warnings; 

sub compare_first_num { 
    my ($a1) = split (/:/, $a); 
    my ($b1) = split (/:/, $b); 
    return $a1 <=> $b1; 
} 

print sort compare_first_num <>; 

它使用<> - 神奇的文件句柄 - 閱讀在命令行中指定STDIN或文件。

或者,在新皮爾斯(5.16+):

print sort { $a =~ s/:.*//r <=> $b =~ s/:.*//r } <>; 

我們用「替身 - 返回」操作比較只是我們感興趣的子串(數字)。