Perl - считать слова файла - PullRequest
       2

Perl - считать слова файла

0 голосов
/ 26 декабря 2018

Я хочу посчитать слова в файле и хочу привести количество одинаковых слов

Мой скрипт

#!/usr/bin/perl

#use strict;
#use warnings;

use POSIX qw(strftime);
$datestring = strftime "%Y-%m-%d", localtime;

print $datestring;

my @files = <'/mnt/SESSIONS$datestring*'>;
my $latest;

foreach my $file (@files) {
  $latest = $file if $file gt $latest;
}

@temp_arr=split('/',$latest);

open(FILE,"<$latest");
print "file loaded \n";
my @lines=<FILE>;
close(FILE);

#my @temp_line;

foreach my $line(@lines) {

    @line=split(' ',$line);
    #push(@temp_arr);

    $line =~ s/\bNT AUTHORITY\\SYSTEM\b/NT__AUTHORITY\\SYSTEM/ig;   

    print $line;

    #print "$line[0] $line[1] $line[2] $line[3] $line[4] $line[5] \n";

}

Мой файл журнала

SID        USER                      TERMINAL        PROGRAM
---------- ------------------------- --------------- -------------------------
         1 SYSTEM                    titi            toto (fifi)
         2 SYSTEM                    titi            toto (fofo)
         4 SYSTEM                    titi            toto (bobo)
         5 NT_AUTHORITY\SYSTEM       titi            roro
         6 NT_AUTHORITY\SYSTEM       titi            gaga
         7 SYSTEM                    titi            gogo (fifi)

         5 rows selected.

Я хочуРезультат:

User = 3 SYSTEM with program toto
, User = 1 SYSTEM with program gogo

Спасибо за любую информацию

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Этот код автоматически определяет размер полей ввода (ваш фрагмент кажется выводом из запроса Oracle) и печатает результаты:

#!/usr/bin/perl

use strict;
use warnings;
use v5.10;

open my $file, '<', 'input.log' or die "$?";

my $data = {};
my @cols_size = ();

while (<$file>) {

    my $line = $_;

    if ( $line =~ /--/) {
        foreach (split(/\s/, $line)) {
            push(@cols_size, length($_) +1);
        }
        next;
    }

    next unless (@cols_size);
    next     if ($line =~ /rows selected/);

    my ($sid, $user, $terminal, $program) = unpack('A' . join('A', @cols_size), $line);
    next unless ($sid);

    $program =~ s/\(\w+\)//;

    $data->{$user}->{$program}++;

}

close $file;

foreach my $user (keys %{$data}) {
    foreach my $program (keys %{$data->{$user}}) {
        say sprintf("User = %s %s with program %s", $data->{$user}->{$program}, $user, $program);
    }
}
0 голосов
/ 02 января 2019

я не понимаю $ countts {$ user} {$ program} ++;

0 голосов
/ 26 декабря 2018

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

Это предположение, основанное на ваших образцах данных, но если ваши данные имеют фиксированную ширину, один из способов разбить их на поля - использовать unpack.Я думаю, что substr может быть более эффективным, поэтому подумайте, сколько файлов вам нужно проанализировать и как долго каждый из них.

Я бы сохранил данные в хеш, а затем разыменовал их после прочтения всех файлов.

my %counts;

open my $IN, '<', 'logfile.txt' or die;
while (<$IN>) {
  next if length ($_) < 51;
  my ($sid, $user, $terminal, $program) = unpack 'A9 @11 A25 @37 A15 @53 A25', $_;

  next if $sid eq '---------';  # you need some way to filter out bogus or header rows

  $program =~ s/\(.+//;         # based on your example, turn toto (fifi) into toto

  $counts{$user}{$program}++;
}
close $IN;

while (my ($user, $ref) = each %counts) {
  while (my ($program, $count) = each %$ref) {
    print "User = $count $user with program $program\n";
  }
}

Вывод из программы:

User = 3 SYSTEM with program toto
User = 1 SYSTEM with program gogo
User = 1 NT_AUTHORITY\SYSTEM with program roro
User = 1 NT_AUTHORITY\SYSTEM with program gaga
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...