如何通过perl从文本文件中聚合并获取特定列中的组计数?

如何通过perl从文本文件中聚合并获取特定列中的组计数?

我有一个这种格式的大文本文件(有 15 行)(srip dial sport dport .....)我想对不同的第一列进行分组并获取组计数,

输入文件:

10.10.10.1 10.10.66.150 60761 502 2019-02-28 13:30:31.447 0 6 ....S. 0 1 44 1 cluster1
10.10.10.1 10.10.66.150 60761 502 2019-02-28 13:30:31.447 0 6 ....S. 0 1 44 1 cluster1
10.10.10.3 10.10.66.150 60761 502 2019-02-28 13:30:31.447 0 6 ....S. 0 1 44 1 cluster1
10.10.10.4 10.10.66.150 60761 502 2019-02-28 13:30:31.447 0 6 ....S. 0 1 44 1 cluster1

我想获得按计数排序的输出文件,如下所示,

10.10.10.1 2
10.10.10.3 1
10.10.10.4 1

我怎样才能做到这一点?

答案1

此代码片段可用于达到预期目的

use strict
use warnings

my $filename = 'data.txt';
open(my $fh, '<', $filename)  or die "Could not open file '$filename' $!";
my %count;
while (my $line = <$fh>) {
    my @words = split(' ', $line);
    my $ip = $words[0];
    $count{$ip}++;
}

while (my ($k,$v)=each %count){
    print "$k $v\n"
}

解释

  • 打开文件进行读取
my $filename = 'data.txt';
open(my $fh, '<', $filename)  or die "Could not open file '$filename' $!";
  • 遍历文件行并通过在空格上分割行来查找单词。从每一行中提取第一列值并将其存储在哈希中,以列作为键,值作为键出现的次数
my %count;
while (my $line = <$fh>) {
    my @words = split(' ', $line);
    my $ip = $words[0];
    $count{$ip}++;
}

注意哈希具有以下结构{ “核心价值” } 这里的哈希值将包含以下值: { '10.10.10.1' => 2, '10.10.10.3' => 1, '10.10.10.4' => 1 }

  • 最后迭代计数哈希中的键、值对并打印键(即列)和值(即计数)
foreach my $key (sort { $count{$b} <=> $count{$a} } keys %count) {
    print "$key $count{$key}\n"
}
  • sort { $count{$b} <=> $count{$a} }是对哈希值进行降序排序
  • 用于sort { $count{$a} <=> $count{$b} }对哈希值进行升序排序
  • 用于sort { $a <=> $b }对哈希键进行升序排序
  • 用于sort {$b <=> $a}对哈希键进行降序排序

答案2

我建议简单一点:

cat [*filename*] | cut -f 1 -d \“ \“ | sort -n | uniq -c

F。

相关内容