Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Запутанная сортировка.   Andrey Kharchenko   14 Feb 2003 12:26:28 
 Re: Запутанная сортировка.   Artem Chuprina   14 Feb 2003 14:53:27 
Архивное /ru.perl/144548dfc24bd.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional