この形式(スリップダイヤルスポーツ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}
ハッシュキーを降順にソートするために使用されます。
答え2
私はより簡単なものを提案します。
cat [*filename*] | cut -f 1 -d \“ \“ | sort -n | uniq -c
F.