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}해시 키를 내림차순으로 정렬하는 데 사용됩니다.

답변2

나는 더 간단한 것을 제안합니다.

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

에프.

관련 정보