我有一个这种格式的大文本文件(有 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。