Contando pelo número de ocorrências na primeira coluna

0

Eu tenho um arquivo de entrada como este:

ATTACK-RESPONSES id check returned root
BACKDOOR ACKcmdC trojan scan
BACKDOOR hack-a-tack attempt 
BACKDOOR WinCrash 1.0 Server Active
ICMP Destination Unreachable Port Unreachable
ICMP Destination Unreachable Port Unreachable
ICMP Destination Unreachable Port Unreachable
SNMP trap tcp

Saída:

1 ATTACK-RESPONSES id check returned root
3 BACKDOOR
3 ICMP Destination Unreachable Port Unreachable 
1 SNMP trap tcp 

Eu quero encontrar e combinar a subseqüência de caracteres mais comum em cada linha do texto e retornar o número de repetições para cada uma delas - portanto, a partir da entrada, eu precisaria obter a Saída.

Como eu poderia fazer isso?

    
por Arash 16.05.2013 / 20:36

1 resposta

1

Isso é bastante difícil com um único passe, e ainda mais difícil se você não assumir que o início precisa ser o mesmo.

Você pode escrever um script perl que corresponda a expressões regulares em relação a linhas anteriores, como:

my @words_on_line = split(/ /, $current_line);
my $i = 0; my $substring = ''; my $expression = '';
do {
  $expression = join(' ', $words_on_line[0..$i++]);
  if ($previous_line =~ m/^$expression/) {
    $substring = $expression;
  }
} until ($substring ne $expression);

Então, você também precisa verificar a próxima linha e potencializar reduzir a correspondência de substring, por exemplo, quando você tem

FOO a b c
FOO a b
FOO d

A primeira correspondência (de 2 para 1) forneceria FOO a b , mas comparando abaixo, você só receberia FOO .

O que se resume a: você precisa armazenar em buffer suas linhas até obter uma linha sem correspondência. Então, ao invés de imprimir, você faria algo como

unless ($substring) {
  push @buffer, $current_line;
  foreach (@buffer) {
    unless (m/$substring/) {
      $buffer_substring = $substring;
    }
  }
} else {
  print scalar @buffer, " $buffer_substring\n";
}

E então você só combinaria isso.

Se não for "o primeiro ponto de partida comum desde o início da linha", você terá que verificar todas as sequências possíveis de palavras contra todas as possíveis sequências de palavras em outras linhas, o que é extremamente complicado e não será reproduzido aqui.

    
por 17.05.2013 / 02:06