我需要一些perl代码来解决以下问题。在此先感谢您的努力。
我的输入文件格式为:'name''版本号'
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
我需要它的格式(中间没有空行): 'name'应该是唯一的,最大'版本号'
tech-sgla-zustand-ts.ini 1.1
tech-sgla-zustand-ts-feld.ini 1.4
tech-sgla-stamm-cds-feld.ini 1.1
答案 0 :(得分: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 :(得分: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" }
答案 2 :(得分: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花生的回复,但我需要对其进行一些修改以使其按照我的要求运行。
感谢eugene y以及你的回应。