Perlを介してテキストファイルの特定の列のグループ数を集計して取得する方法は?

Perlを介してテキストファイルの特定の列のグループ数を集計して取得する方法は?

この形式(スリップダイヤルスポーツdport ....)の大きなテキストファイル(15行)があります。他の最初の列に基づいてグループ化し、グループ数を取得したいと思います。

入力ファイル:

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}ハッシュキーを降順にソートするために使用されます。

おすすめ記事