按第一列出现的次数计数

按第一列出现的次数计数

我有一个这样的输入文件:

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

输出:

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

我想找到并匹配文本每一行中最长的公共子字符串并返回每个子字符串的重复次数 - 因此我需要从输入中获取输出。

我怎样才能做到这一点?

答案1

这对于单次通过来说相当困难,如果您不假设开始需要相同的话,这会更加困难。

您可以编写一个 perl 脚本,将正则表达式与前面的行进行匹配,如下所示:

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);

然后,你还必须检查下一个线与电位减少子字符串匹配,例如当你有

FOO a b c
FOO a b
FOO d

第一次匹配(从 2 到 1)会给您FOO a b,但比较下面,您只会得到FOO

归根结底,你需要缓冲你的行,直到你得到不匹配的行。因此,你可以做类似的事情,而不是打印

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

然后你只需将它们结合起来。

如果不是“从行首开始的第一个公共单词”,您就必须检查其他行中每个可能的单词序列与其他行中每个可能的单词序列,这非常复杂,我不会在这里重现。

相关内容