이전 행과 같으면 콘솔에서 행을 건너뛰고 개수를 추가합니다(라이브).

이전 행과 같으면 콘솔에서 행을 건너뛰고 개수를 추가합니다(라이브).

연속된 중복 행을 필터링하려면 uniq를 사용하세요.

while (true) do echo 1; echo 2; echo 2; echo 1; sleep 1; done | uniq

이 되다:

1
2
1

반복 횟수를 추가하면서 반복되는 연속 행을 제거하는 방법이 있습니까? 예를 들어 위의 예에서

1
2 (2)
1

새로운 "1" 행이 도착하면 위의 내용은 다음과 같아야 합니다.

1
2 (2)
1 (2)

이는 파일용이 아니라 새 줄이 실시간으로 추가되는 스트림(예: tail -f)용입니다.

답변1

중복 항목을 제거하는 대신 개수를 계산합니다.

awk '{ if (h[$0]++) { s=" (" h[$0] ")" } else { s="" }; printf "%s%s\n", $0, s }'

이 배열은 h[]입력을 추적합니다(현재 행은 $0). 값이 1보다 크면 현재 줄과 함께 인쇄됩니다.

고유한 행 세트는 메모리에 보관되므로 중복 행이 상대적으로 적은 대규모 데이터 세트가 있는 경우 대부분의 데이터 세트가 RAM(또는 기껏해야 스왑)에 보관됩니다. 솔루션을 구축할 때 이 점에 유의하세요.

1입력 라인 , 2, 의 경우 다음 과 같은 출력을 얻게 됩니다.213

1
2
2 (2)
1 (2)
3

입력 스트림이 유한한 경우(예제나 제안의 경우는 아님 tail -f) 모든 값을 수집하여 해당 값과 개수를 출력할 수 있습니다. 하지만 그렇지 않기 때문에 우리는 그렇게 할 수 없습니다.

관련 정보