uniq -c는 임의의 행 그룹 수와 동일합니다.

uniq -c는 임의의 행 그룹 수와 동일합니다.

순서를 유지하면서 반복되는 줄 그룹을 세어 줄이려고 하는 약 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성능이 향상될 수 있습니다.

관련 정보