uniq -c
같은 줄의 연속 발생 횟수를 계산하는 데 매우 유용합니다.
$ seq 1 1000 | awk '{ if ($1 > 100 && $1 <= 200) { print "hi" } else {print "bye"} }' | uniq -c
100 bye
100 hi
800 bye
그러나 각 고유 행의 개수를 얻으려면 먼저 입력을 정렬해야 하는데 이는 다소 비효율적인 것 같습니다.
$ seq 1 1000 | awk '{ if ($1 > 100 && $1 <= 200) { print "hi" } else {print "bye"} }' | sort | uniq -c
온라인 알고리즘을 사용하여 고유 행의 모든 발생을 계산하는 관용적 방법이 있습니까?
답변1
입력을 먼저 정렬하는 것이 가장 효율적입니다.
awk one-liner를 사용하여 이 작업을 수행할 수 있습니다.
awk '{++seen[$0]} END {for (line in count) printf "%7d %s\n", count[line], line}'
메모리와 CPU 시간 측면에서 어느 것이 더 효율적인지는 데이터와 구현에 따라 다릅니다. sort
이론적으로는 추가 작업을 수행하기 때문에 효율성이 떨어지지만, 반면에 한 가지 작업만 수행하고 잘 수행하는 반면 awk는 범용 도구입니다. 중복된 항목이 많으면 awk는 메모리를 덜 사용하고 속도가 더 빨라질 수 있습니다. 반면에 많은 정렬 구현은 RAM에 맞지 않는 거대한 데이터 세트를 처리할 수 있으며 awk는 충돌이 발생합니다.