순서를 유지하면서 반복되는 줄 그룹을 세어 줄이려고 하는 약 1-2백만 줄의 파일이 있습니다.
uniq -c
잘 작동합니다:
$ perl -E 'say for (("foo") x 4, ("bar") x 4, "baz", ("foo", "bar", "baz") x 4)' | uniq -c
4 foo
4 bar
1 baz
1 foo
1 bar
1 baz
1 foo
1 bar
1 baz
1 foo
1 bar
1 baz
1 foo
1 bar
1 baz
내 사용 사례에서는(그러나 아래 foo-bar-baz 예는 아님) count오른쪽라인 효율은 아래와 같이 약 20% 향상됩니다.
$ perl -E 'say for (("foo") x 4, ("bar") x 4, "baz", ("foo", "bar", "baz") x 4)' \
| sed 's/^/__STARTOFSTRINGDELIMITER__/' \
| paste - - \
| uniq -c \
| sed -r 's/__STARTOFSTRINGDELIMITER__//; s/__STARTOFSTRINGDELIMITER__/\n\t/;'
2 foo
foo
2 bar
bar
1 baz
foo
1 bar
baz
1 foo
bar
1 baz
foo
1 bar
baz
1 foo
bar
1 baz
(이 형식을 받아들일 수 있습니다.)
임의 수의 행(2~10개 행과 같은 합리적인 버퍼 수 유지)의 중복 그룹을 단일 복사본 + 행 수로 줄이려면 어떻게 해야 합니까?
위의 예를 따르면 다음과 같은 출력을 원합니다.
4 foo
4 bar
1 baz
4 foo
bar
baz
답변1
벤치마킹할 만큼 큰 데이터 세트가 없습니다. 시도 해봐:
$ perl -E 'say for (("foo") x 4, ("bar") x 4, "baz", ("foo", "bar", "baz") x 4)' | awk 'NR == 1 {word=$0; count=1; next} $0 != word {print count,word; word=$0; count=1; next} { count++ } END { print count,word }'
4 foo
4 bar
1 baz
1 foo
1 bar
1 baz
1 foo
1 bar
1 baz
1 foo
1 bar
1 baz
1 foo
1 bar
1 baz
mawk
대체를 사용하면 awk
성능이 향상될 수 있습니다.