построчная считка значений из файла, Sasha, 21-Фев-05, 12:13 [смотреть все]Народ, помогите плииз. Есть у меня файл, допустим tst.123 В нём приблизительно такая инфа: Name:xxx Src:0 Max=3000.123 Min= 92.234 Name:yyy Src:0 Max= 125.222 Min= 0.354 . . . Name:xxx Src:0 Max=4567.482 Min= 195.567Вопрос, как мне на перле написать прогу которая бы считывала числовые значения Max и Min (для конкретной строки по имени (yyy, xxx, zzz)сумировало их и выводило эти значения в новый файл??? Помогите плииз, а то повесят на работе.((( |
- построчная считка значений из файла, allez, 13:22 , 21-Фев-05 (1)
А пробелы после знака равенства в этом файле, так же как и в примере, то есть, то нет? Это я к тому, что они могут сделать бяку при разделении строки с помощью split.И второй вопрос: насколько критично в данном случае использование perl? Если пробелов после знаков равенства не будет, то достаточно такой строчки: $ cat tst.123 | gawk '{print $3 " " $4}' | gawk -F= '{print $2 " " $3}' | gawk 'BEGIN {min=0; max=0} {max=max+$1; min=min+$3} END {print "Max = " max " Min = " min }' >> tst.out
- построчная считка значений из файла, Sasha, 14:00 , 21-Фев-05 (2)
да пробелы то есть то нет. И использование перла очень критично. А ещё горит конкретно, как говорится нужно было ещё на позавчера
- построчная считка значений из файла, XMan, 14:18 , 21-Фев-05 (3)
Как вариант:$var =~ s/\s+//g; ($garbage,$max,$min)=split(/Max\=|Min\=/,$var);
- построчная считка значений из файла, allez, 14:32 , 21-Фев-05 (4)
#!/usr/bin/perlopen (IN, "tst.123"); $max_sum=0; $min_sum=0; while (<IN>) { for ($i=0; $i<6; $i++) { ~s/= /=/; ~s/ / /; ~s/\t/ /; } @array=split (' ',$_); @max=split ('=',$array[2]); @min=split ('=',$array[3]); $max_sum+=$max[1]; $min_sum+=$min[1]; } close IN; open (OUT, ">tst.out"); print OUT "Max = $max_sum\tMin = $min_sum\n"; close OUT; P.S.: Пока писал, XMan дал ответ, причем гораздо лучше, чем мой. Внесу единственную поправку: $var=$_; # без этого присваивания - не сработает $var=~ s/\s+//g; ($garbage,$max,$min)=split(/Max\=|Min\=/,$var); или, как вариант: $_=~ s/\s+//g; ($garbage,$max,$min)=split(/Max\=|Min\=/,$_);
- построчная считка значений из файла, XMan, 17:01 , 21-Фев-05 (5)
Встречная поправка для случая, если читается в $_ (например, посредством while (<>)):s/\s+|\n|\r//g; ($garbage,$max,$min)=split(/Max\=|Min\=/); PS. \n и \r это на случай, если до этого chomp не делается.
- построчная считка значений из файла, Sasha, 17:31 , 21-Фев-05 (6)
спасибо, получилось. Правда своими силами. Выводится массив в текстовый файл. такого вида: VitaR -> 47.286 mc_all -> 0 Galch -> 20.394 Pamap -> 0 Zuk -> 0 Rakzi -> 0.579 Myhiv -> 0 Redex -> 0 sal -> 0 Но возник новый вопрос, как написать скрипт, который бы теперь через логин и пароль в html-странице выдавал значение из этого текстового файла (конкретное)ю Например логин Login: VitaR Passwd: 1234 И результатом исполнения выводится: 47.286 Подскажите плиз
- построчная считка значений из файла, Vladimir D Belousov, 10:22 , 25-Фев-05 (7)
>спасибо, получилось. Правда своими силами. Выводится массив в текстовый файл. такого вида: > >VitaR -> 47.286 >mc_all -> 0 >Galch -> 20.394 >Pamap -> 0 >Zuk -> 0 >Rakzi -> 0.579 >Myhiv -> 0 >Redex -> 0 >sal -> 0 >Но возник новый вопрос, как написать скрипт, который бы теперь через логин >и пароль в html-странице выдавал значение из этого текстового файла (конкретное)ю > >Например логин Login: VitaR > > Passwd: 1234 >И результатом исполнения выводится: 47.286 >Подскажите плиз D httpd.conf включить авторизацию и пользоваться REMOTE_USER в окружении:
#!/usr/bin/perl use strict; my $result; open(DATA, "</your/file") || die $!; while(<DATA>){ if(/^$ENV{REMORTE_USER}[^\d.]*([\d.]+)[^\d.]+$/){$result = $1; last;} } close(DATA); print "Content-type: text/plain\n\n"; print $result || "No such user\n"; Если файл небольшой, то можно #!/usr/bin/perl use strict; $/=''; open(FILE,"/your/file"); my $lines=<FILE>; close(FILE); my $result = ($lines =~ /\b$ENV{REMOTE_USER}\b[^\d.]+([\d.]+)/gsx)[0]; print "Content-type: text/plain\n\n".($result eq '' ? "No such user" : $result); Только $/ восстановить надо
|