|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 14 Feb 2003 14:53:27 To : "Andrey Kharchenko" Subject : Re: Запутанная сортировка. -------------------------------------------------------------------------------- Здравствуй, Andrey Kharchenko. AK> Задача не из легких, сам запутался. Hадеюсь на помощь. Из легких. Hо при наличии подобающего образования. AK> Есть лог-файл, который поделен на столбцы, разделенные пробелами. Имя хоста, AK> объем, имя пользователя. AK> =====[ лог-файл ]======= AK> hostala 23376 ala AK> tod 237 sonya AK> tod 3223 dima AK> quin 21 sonya AK> tod 2312 sonya AK> tod 23 dima AK> quin 2 dima AK> ====================== AK> Hужно делать отчет, в котором должно показываться следующее: Имя AK> пользователя, объем, хост: AK> ======[ отчет ]=========== AK> ala 23376 hostala AK> sonya 2549 tod AK> sonya 21 quin AK> dima 3246 tod AK> dima 2 quin AK> ======================== AK> Т.е. каждый пользователь должен сортироваться по хостам, с которых он AK> потреблял трафик, а трафик на эти хосты должен суммироваться. Если же он AK> пользовался своим именем на нескольких хостах, то сортировка должна быть для AK> всех хостов из под которых он потреблял трафик. AK> Я допетрил, как отсортировать по двум колонкам, имя и объем. Вот программка: AK> =================================== AK> #!/usr/bin/perl AK> open(LOG,"<-"); AK> @log=<LOG>; AK> close LOG; AK> for ($i=0; $i<@log; $i++) { AK> @line = split(" ",$log[$i]); AK> $fields{$line[7]} += $line[4]; AK> } AK> foreach $acct (sort keys %fields) { AK> $summbytes = $fields{$acct}; AK> if($acct eq "-") { next; } AK> print "$acct, $summbytes\n"; AK> } AK> exit; AK> =================================== AK> Получается: AK> ala, 23376 AK> sonya, 2570 AK> dima, 3248 AK> Hо тут не видно, с какого хоста заходил пользователь. Hужно более AK> детализированный отчет. AK> Помогите, пожалуйста. Лучше примером. Вообще обычно такие задачи решают реляционными базами данных. Hо если уж очень надо... ==== 8< [test.pl] ==== #!/usr/bin/perl -w use strict; my %visits; while (<>) { my ($host, $bytes, $user) = /(\S+)\s+(\d+)\s+(\S+)/; next unless $user; $visits{$user}{$host} += $bytes; } foreach my $user (sort keys %visits) { foreach my $host (sort keys %{$visits{$user}}) { print "$user $visits{$user}{$host} $host\n"; } } ==== >8 [test.pl] ==== -- Artem Chuprina Communiware.net RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/122.256, ICQ: 13038757 --- ifmail v.2.15dev5 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/144548dfc24bd.html, оценка из 5, голосов 10
|