2009-06-29 4 views
0

J'ai un fichier qui contient énormément de noms de réseaux. Je voudrais compresser les filets de bus comme ci-dessous:comment compresser un réseau de bus?

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 
+0

pourriez-vous le préciser? que signifient les numéros? Les barres obliques ont-elles une signification particulière ou sont-elles seulement des parties de la chaîne? et que signifient les chiffres? – cube

+0

vous pouvez le traiter comme une partie de la chaîne. Le nombre est l'indice d'un net. dans la conception vlsi, nous utilisons ce format pour définir un bus .. par exemple ddr a 64 bits de données par dimm (dq [63: 0]) –

+0

Il est clair pour moi, voici votre point de retour. – colithium

Répondre

4

La question n'a pas été claire. Cependant, ce que je suis venu avec:

#!/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

Sans entrer dans les moindres détails, il semble que vous voulez

  1. Trier les lignes (de tout ordre, non?)
  2. Joignez-vous à des lignes adjacentes si elles peuvent être représentés comme préfixe [0: x] ou peut-être le préfixe [x: y] (où les matches de préfixe [az] +)

Ceci est probablement le moyen le plus efficace pour atteindre ce. Le tri regroupera toutes les lignes qui appartiennent ensemble. Et joindre des lignes adjacentes est une opération simple et directe. Si vous savez que toutes les entrées récurrentes commencent à [0] et sont contiguës, alors vous joindre à des lignes adjacentes est encore plus trivial.

+0

vous avez raison! mais je n'ai aucune idée de la façon dont vous y parvenez en ligne? pouvez-vous me montrer la ligne de commande? –

+0

Dépend de votre langage de programmation. Après le tri, vous partitionnez vos lignes en plages avec le même préfixe (par exemple, une partition serait toutes les lignes commençant par abc/def/gh). Ensuite, pour chaque partition, vous déterminez quels numéros sont présents. Si ces nombres forment une suite contiguë x-y, remplacez ces lignes par une seule ligne 'prefix' [x: y]. – MSalters

Questions connexes