표준 입력에서 행을 그룹화하고 계산하는 가장 좋은 방법은 무엇입니까?

표준 입력에서 행을 그룹화하고 계산하는 가장 좋은 방법은 무엇입니까?

옛날부터 나는 ... | sort | uniq -c | sort -nr입력의 각 줄에 몇 개의 행이 있는지 파악하기 위해 입력 줄을 그룹화하고 계산해 왔습니다.

더 좋은 방법이 있나요? 방금 나쁜 습관이 생겼나요? Ubuntu Linux 18.04+(또는 이미 존재하는 것 apt-get) 에 설치될 표준 Unix 도구를 사용하는 더 좋은 방법이 있습니까?

답변1

나는 당신이 표준적이고 명백한 *nix 방식을 가지고 있다고 생각합니다. 이것은 매우 훌륭하고 합리적인 접근 방식입니다.

$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | sort | uniq -c | sort -nr
      2 cc
      2 aa
      1 dd
      1 bb

물론 하나의 명령만 사용하도록 작은 스크립트를 대신 사용할 수도 있습니다. 예를 들어 다음과 같습니다 gawk.

$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | 
  gawk '
    BEGIN{ PROCINFO["sorted_in"] = "@val_num_desc" }
   { count[$0]++ } 
   END{ for(line in count){ print count[line],line}}'
2 cc
2 aa
1 dd
1 bb

또는 펄:

$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | 
   perl -lne '$k{$_}++ }{ for $i (sort { $k{$b} <=> $k{$a} } keys %k ){print "$k{$i} $i"}'
2 aa
2 cc
1 bb
1 dd

그러나 이것은 단지 바퀴를 재발명하는 것에 불과합니다. 또한 두 스크립트 모두 메모리의 모든 입력을 다시 로드하므로 많은 양의 데이터를 처리할 때 문제가 될 수 있습니다. 그러니 지금 하고 있는 일을 계속하세요. 이것은 훌륭한 솔루션이며 아마도 가장 효율적인 솔루션일 것입니다.

관련 정보