2010-11-16 75 views
-2

我需要一些perl代碼來解決以下問題。在此先感謝您的努力。基於第一列刪除重複條目並保留最新條目,使用Perl

我輸入的是在此格式的文件:「名稱」「版本號」


tech-sgla-zustand-ts.ini 1.1 
tech-sgla-zustand-ts-feld.ini 1.1 
tech-sgla-stamm-cds-feld.ini 1.1 
tech-sgla-zustand-ts-feld.ini 1.2 
tech-sgla-zustand-ts-feld.ini 1.4 
tech-sgla-zustand-ts-feld.ini 1.3 

我需要它的格式(中間沒有空行): 的'名' 應該是最大 '版本號'


tech-sgla-zustand-ts.ini 1.1 
tech-sgla-zustand-ts-feld.ini 1.4 
tech-sgla-stamm-cds-feld.ini 1.1 
獨特

回答

0
open(TOUT, "temp.txt"); 
while($line = <TOUT>){ 
    my ($ini, $vers) = split/+/, $line; 
    print "ini $ini vers $vers"; 
    if (exists $iniFiles{$ini}) { 
     $iniFiles{$ini} = $vers if ($iniFiles{$ini} < $vers); 
    } 
    else { 
     $iniFiles{$ini} = $vers; 
    } 
} 
print "\n"; 
while (my ($k,$v) = each %iniFiles) { 
    print "$k $v"; 
    $ssldata = $k . " " . $v; 
} 

感謝OMG_peanuts烏拉圭回合性反應,但我需要修改它一點點地把它按我的要求工作。
感謝eugene y以及我們的迴應。

1

如果輸出順序不要緊,你可以使用此一行代碼:

perl -ane '$h{$F[0]} = $F[1] if $F[1] > $h{$F[0]}; 
END { print "$_ $h{$_}\n" for keys %h }' file 

否則,此腳本應該這樣做:

my (%h, @a); 

while (<>) { 
    my ($name, $ver) = split; 
    push @a, $name unless exists $h{$name};   
    $h{$name} = $ver if $ver > $h{$name} ; 
} 

print "$_ $h{$_}\n" for @a; 
1

你可以使用:

my %iniFiles =(); 
while (<>) { 
    my ($ini, $vers) = split/+/, $_; 
    if (exists $iniFiles{$ini}) { 
    $iniFiles{$ini} = $vers if ($iniFiles{$ini} < $vers); 
    } else { $iniFiles{$ini} = $vers } 
} 
while (my ($k,$v) = each %iniFiles) { print "$k $v\n" } 

或者如果輸入順序很重要:

my @inis =(); 
my %iniFiles =(); 
while (<>) { 
    my ($ini, $vers) = split/+/, $_; 
    if (exists $iniFiles{$ini}) { 
    $iniFiles{$ini} = $vers if ($iniFiles{$ini} < $vers); 
    } else { push @inis, $ini; $iniFiles{$ini} = $vers } 
} 
foreach (@inis) { print "$_ $iniFiles{$_}\n" } 
相關問題