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