Perl + слово нумерации или параметр в файле - PullRequest
0 голосов
/ 20 июля 2010

Мне нужна помощь по нумерации текста в файле.

У меня также есть Linux-машина, и мне нужно написать скрипт на Perl

У меня есть имя файла: file_db.txt

В этом файле есть такие параметры, как имя, ParameterFromBook, NumberPage, BOOK_From_library, цена и т. Д. Каждый параметр равен чему-то как name = elephant

Мой вопрос Как это сделать с помощью perl

Я хочу дать номер для каждого параметра (перед "="), который повторяется (уникальный параметр) в файле, и увеличивать (+1) новый номер следующего повторного параметра до EOF

Lidia

Например

file_db.txt перед нумерацией

    parameter=1
    name=one

    parameter=2
    name=two

file_db.txt после нумерации параметров

    parameter1=1
    name1=one

    parameter2=2
    name2=two
  • другие примеры

Пример 1 до

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

Пример 1 после нумерации параметров

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

Пример 2 до

file_db.txt перед нумерацией

       lines_and_words=1
       list_of_books=3442

       lines_and_words=13
       list_of_books=344224

       lines_and_words=120
       list_of_books=341

Пример 2 после

file_db.txt после нумерации параметров

        lines_and_words1=1
        list_of_books1=3442

        lines_and_words2=13
        list_of_books2=344224

        lines_and_words3=120
        list_of_books3=341

Ответы [ 4 ]

1 голос
/ 20 июля 2010

Это может быть сжато до однострочного сценария perl, хотя я не особенно рекомендую его, если вы хотите удобочитаемость:

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

Эта версия читает из указанного файла, а не используеткомандная строка:

#!/usr/bin/perl
open IN, "/tmp/file";
s/(.*)=/$k{$1}++;"$1$k{$1}="/e and print while <IN>;
1 голос
/ 20 июля 2010

С моей точки зрения, вы, вероятно, хотите пронумеровать блоков , а не только вхождения.Таким образом, вы, вероятно, хотите, чтобы число на каждой из клавиш было как минимум таким же большим, как у самой ранней повторяющейся клавиши.

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

Однако, если вы просто хотели дать ключ, это конкретный счет.Этого достаточно:

my %occur;
while ( <$in> ) {
    my ( $pre, $key, $data ) = m/^(\s*)(\w+)=(.*)/;
    $occur{$key}++;
    print { $out } "$pre$key$occur{$key}=$data\n";
}
0 голосов
/ 20 июля 2010

Если Perl не обязателен, вот версия 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 голосов
/ 20 июля 2010

в значительной степени псевдокод:

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 );

Это похоже на назначение CS101.Действительно ли полезно спрашивать о полных решениях, а не задавать конкретные технические вопросы, если у вас возникли трудности?

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