удаление дубликатов записей на основе первого столбца и сохранение последней записи с использованием Perl - PullRequest
0 голосов
/ 16 ноября 2010

Мне нужен код на Perl для решения следующей проблемы.заранее благодарю за ваши усилияформат (без пустых строк между ними): имя должно быть уникальным с максимальным номером версии


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

Ответы [ 3 ]

1 голос
/ 16 ноября 2010

Вы можете использовать:

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" }
1 голос
/ 16 ноября 2010

Если порядок вывода не имеет значения, вы можете использовать этот однострочный:

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;
0 голосов
/ 18 ноября 2010
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 за ваш отклик, но мне нужно было немного его изменить, чтобы он работал в соответствии с моими требованиями. Спасибо Евгению, а также за ваш отклик.

...