как сжать сетку автобуса? - PullRequest
0 голосов
/ 29 июня 2009

У меня есть файл, который содержит огромное количество сетевых имен. Я хотел бы сжать сети шин, как показано ниже:

abc/def/gh[0]
abc/def/gh[1]
abc/def/gh[2]
ab/ef/xx
abc/def/gh[3]

до

abc/def/gh[3:0]
ab/ef/xx

Ответы [ 2 ]

4 голосов
/ 29 июня 2009

Вопрос был неясен. Однако вот что я придумал:

#!/usr/bin/perl

use strict;
use warnings;

my %data;
while (<DATA>) {
    chomp;
    if (s/^(.+)\[(\d+)\]/$1/) {
        $data{$1} = $2;
    }
    else {
        $data{$_} = 0;
    }
}

for ( keys %data ) {
    if ( $data{$_} ) {
        print "$_\[$data{$_}:0\]\n";
    }
    else {
        print "$_\n";
    }
}

__END__
abc/def/gh[0]
abc/def/gh[1]
abc/def/gh[2]
ab/ef/xx
abc/def/gh[3]
1 голос
/ 29 июня 2009

Не вдаваясь в мелкие детали, кажется, вы хотите

  1. Сортировка строк (порядок не имеет значения, верно?)
  2. Соедините соседние строки, если они могут быть представлены в виде префикса [0: x] или, возможно, префикса [x: y] (где префикс соответствует [a-z] +)

Это, пожалуй, самый эффективный способ достичь этого. Сортировка сгруппирует все строки вместе, которые принадлежат друг другу. А объединение смежных линий - простая и понятная операция. Если вы знаете, что все повторяющиеся записи начинаются с [0] и являются смежными, то объединение смежных строк еще более тривиально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...