연속된 중복 행을 필터링하려면 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
, 의 경우 다음 과 같은 출력을 얻게 됩니다.2
1
3
1
2
2 (2)
1 (2)
3
입력 스트림이 유한한 경우(예제나 제안의 경우는 아님 tail -f
) 모든 값을 수집하여 해당 값과 개수를 출력할 수 있습니다. 하지만 그렇지 않기 때문에 우리는 그렇게 할 수 없습니다.