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