2010-07-20 43 views
-4

我需要關於如何計算文件中文本的幫助。perl +數字或文件中的參數

我也有Linux機器,我需要寫用Perl腳本

我有文件名:file_db.txt

在這個文件中有這樣的名字,ParameterFromBook,NumberPage,BOOK_From_library,價格等參數 每個參數等於什麼姓名=大象

我的問題如何被Perl

我想給數每個參數做到這一點(前「=」)反覆(唯一參數)的文件中,並通過增加編號

parameter=1 
    name=one 

    parameter=2 
    name=two 

(1)

例如

file_db.txt之前的下一個重複參數的新號碼,直至EOF

利迪婭參數編號後的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編號

前後

例題參數後

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 

回答

1

它可以濃縮到一行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>; 
+0

你的意思大約可讀性:(?其不可靠的腳本) – lidia 2010-07-20 15:01:31

+0

其做工精細(但我需要知道,如果這個腳本是可信的) 請您諮詢 利迪婭 – lidia 2010-07-20 15:10:37

+0

什麼,我需要改變,如果我想把PATH:/ tmp/file in pcae給參數給腳本? – lidia 2010-07-20 15:13:03

0

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分配。如果您遇到困難,請求完整的解決方案而不是詢問具體的技術問題是否真的很好?

+0

我得到如下錯誤:在循環變量上缺少$ ./stam第8行。 – lidia 2010-07-20 13:51:24

+0

@lidia正如亞歷山大所說,它是僞代碼(有點)。這個想法是,你現在把它變成最終的解決方案。我們不是在這裏爲你寫代碼。 – Telemachus 2010-07-20 14:26:13

+0

我開始lern perl 所以如果你可以請幫助我嗎? – lidia 2010-07-20 14:31:29

0

如果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

如何在perl腳本中構建awk? – lidia 2010-07-20 13:52:05

+0

我提到過,如果你不限於Perl,你可以使用這個awk一行代碼。否則,看看其他的Perl靈感答案 – ghostdog74 2010-07-20 14:03:29

+0

是否可以將它與系統集成? – lidia 2010-07-20 14:05:17

1

我看它的樣子,你可能要編號並不僅僅是發生。所以你可能希望每個鍵上的數字至少和最早的重複鍵一樣大。

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

+1:薩恩代碼。 – 2010-07-20 16:17:00