고유 경로의 온라인 통계

고유 경로의 온라인 통계

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는 충돌이 발생합니다.

관련 정보