2010-07-20 6 views
-4

J'ai besoin d'aide pour numéroter du texte dans un fichier.perl + mot de numération ou paramètre dans le fichier

J'ai aussi la machine linux et je dois écrire le script avec perl

je nom de fichier: file_db.txt

Dans ce fichier ont des paramètres tels que le nom, ParameterFromBook, NombrePage, BOOK_From_library, prix, etc. chaque paramètre égal à quelque chose comme nom = éléphant

Ma question Comment faire cela par perl

Je veux donner le numéro pour chaque paramètre (avant le signe « = ») qui a répété (unique paramètre) dans le fichier, et l'augmentation de (1) le nouveau numéro du paramètre suivant répété jusqu'à ce que EOF

Lidia

Par exemple

file_db.txt avant la numérotation

parameter=1 
    name=one 

    parameter=2 
    name=two 

fichier_db.txt après la numérotation des paramètres

parameter1=1 
    name1=one 

    parameter2=2 
    name2=two 
  • autres exemples

Exemple1 avant

name=elephant 
    ParameterFromBook=234 
    name=star.world 
    ParameterFromBook=200 
    name=home_room1 
    ParameterFromBook=264 

Exemple1 après les paramètres de numérotation

name1=elephant 
    ParameterFromBook1=234 
    name2=star.world 
    ParameterFromBook2=200 
    name3=home_room1 
    ParameterFromBook3=264 

Exemple2 avant

file_db.txt avant la numérotation

 lines_and_words=1 
     list_of_books=3442 

     lines_and_words=13 
     list_of_books=344224 

     lines_and_words=120 
     list_of_books=341 

Example2 après

file_db.txt après les paramètres de numérotation

 lines_and_words1=1 
     list_of_books1=3442 

     lines_and_words2=13 
     list_of_books2=344224 

     lines_and_words3=120 
     list_of_books3=341 

Répondre

1

Il peut être condensé à un joli script perl une ligne facilement, bien que je ne recommande pas particulièrement si vous voulez la lisibilité:

#!/usr/bin/perl 
s/(.*)=/$k{$1}++;"$1$k{$1}="/e and print while <>; 

Cette version se lit d'une spécifiée fichier, plutôt que d'utiliser la ligne de commande:

#!/usr/bin/perl 
open IN, "/tmp/file"; 
s/(.*)=/$k{$1}++;"$1$k{$1}="/e and print while <IN>; 
+0

ce que vous entendez par la lisibilité: (son script non fiable) – lidia

+0

son beau travail (mais je dois savoir si ce script est croyable) s'il vous plaît vos conseils Lidia – lidia

+0

ce que je dois changer si je veux mettre la CHEMIN:/tmp/fichier dans plcae pour donner une argumentation au script? – lidia

0

dans à peu près pseudo-code:

open(DATA, "file"); 
my @lines = <DATA>; 
my %tags; 
foreach line (@lines) 
{ 
    my %parts=split(/=/, $line); 
    my $name=$parts[0]; 
    my $value=$parts[1]; 

    $name = ${name}$tags{ $name }; 
    $tags{ $name } = $tags{ $name } + 1; 
    printf "${name}=$value\n"; 
} 
close(DATA); 

Cela ressemble à une mission de CS101. Est-ce vraiment bien de demander des solutions complètes au lieu de poser des questions techniques spécifiques si vous avez des difficultés?

+0

Je reçois une erreur comme: Manquant $ sur la variable de boucle à la ligne ./stam 8. ??? – lidia

+0

@lidia Comme l'a dit n-alexander, c'est du pseudo-code (sorte de). L'idée est que vous la transformiez maintenant en une solution finale. Nous ne sommes pas ici pour écrire du code pour vous. – Telemachus

+0

Je commence à parler perl alors si vous pouvez s'il vous plaît aidez-moi? – lidia

0

Si Perl n'est pas un must, voici une version awk

$ cat file 
    name=elephant 
    ParameterFromBook=234 
    name=star.world 
    ParameterFromBook=200 
    name=home_room1 
    ParameterFromBook=264 

$ awk -F"=" '{s[$1]++}{print $1s[$1],$2}' OFS="=" file 
    name1=elephant 
    ParameterFromBook1=234 
    name2=star.world 
    ParameterFromBook2=200 
    name3=home_room1 
    ParameterFromBook3=264 
+0

comment construire l'awk dans le script perl? – lidia

+0

J'ai mentionné que si vous n'êtes pas limité à Perl, vous pouvez utiliser cette doublure awk one. Sinon, regardez les autres réponses Perl pour l'inspiration – ghostdog74

+0

est-il possible de l'intégrer avec le système? – lidia

1

La façon dont je regarde, vous voulez probablement numéro blocs et pas seulement les occurrences. Donc, vous voulez probablement que le nombre sur chaque touche soit au moins aussi grand que la première touche répétée.

my $in = \*::DATA; 
my $out = \*::STDOUT; 
my %occur; 
my $num = 0; 
while (<$in>) { 
    if (my ($pre, $key, $data) = m/^(\s*)(\w+)=(.*)/) { 
     $num++ if $num < ++$occur{$key}; 
     print { $out } "$pre$key$num=$data\n"; 
    } 
    else { 
     $num++; 
     print; 
    } 
} 
__DATA__ 
    name=elephant 
    ParameterFromBook=234 
    name=star.world 
    ParameterFromBook=200 
    name=home_room1 
    ParameterFromBook=264 

Cependant, si vous vouliez simplement donner la clé c'est un compte particulier.Cela suffit:

my %occur; 
while (<$in>) { 
    my ($pre, $key, $data) = m/^(\s*)(\w+)=(.*)/; 
    $occur{$key}++; 
    print { $out } "$pre$key$occur{$key}=$data\n"; 
} 
+0

+1: Code sain. –

Questions connexes