开发者

perl + numeration word or parameter in file

I need help about how to numeration text in file.

I have also linux machine and I need to write the script with perl

I have file name: file_db.txt

In this file have parameters like name,ParameterFromBook,NumberPage,BOOK_From_library,price etc Each p开发者_如何学编程arameter equal to something as name=elephant

My question How to do this by perl

I want to give number for each parameter (before the "=") that repeated (unique parameter) in the file , and increase by (+1) the new number of the next repeated parameter until EOF

lidia

For example

file_db.txt before numbering

    parameter=1
    name=one

    parameter=2
    name=two

file_db.txt after parameters numbering

    parameter1=1
    name1=one

    parameter2=2
    name2=two
  • other examples

Example1 before

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

Example1 after parameters numbering

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

Example2 before

file_db.txt before numbering

       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 after

file_db.txt after parameters numbering

        lines_and_words1=1
        list_of_books1=3442

        lines_and_words2=13
        list_of_books2=344224

        lines_and_words3=120
        list_of_books3=341


It can be condensed to a one line perl script pretty easily, though I don't particularly recommend it if you want readability:

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

This version reads from a specified file, rather than using the command line:

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


The way I look at it, you probably want to number blocks and not just occurrences. So you probably want the number on each of the keys to be at least as great as the earliest repeating key.

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

However, if you just wanted to give the key it's particular count. This is enough:

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


in pretty much 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 );

This looks like a CS101 assignment. Is it really good to ask for complete solutions instead of asking specific technical questions if you have difficulty?


If Perl is not a must, here's an awk version

$ 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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜