빈 줄을 유지하면서 awk로 중복 줄을 제거하는 방법은 무엇입니까?


13

아래 awk명령은 여기에 설명 된 대로 모든 중복 행 을 제거합니다 .

awk '!seen[$0]++'

텍스트에 빈 줄이 포함되어 있으면 빈 줄을 하나만 제외하고 모두 삭제됩니다.

비어 있지 않은 모든 중복 줄을 삭제하면서 빈 줄 을 모두 유지하려면 어떻게해야awk 합니까? 간단한 설명도 포함하십시오.

답변:


28

다른 옵션은 다음을 확인하는 것입니다 NF. 예 :

awk '!NF || !seen[$0]++'

11

대안 적으로

awk '!/./ || !seen[$0]++' file

주요 요령은 동일 seen[$0]++하며, seen연관 배열에서 키가 현재 줄 ( $0) 인 항목을 만듭니다 . 따라서이 !seen[$0]++줄이 이미 보이면 거짓이됩니다. 는 /./그래서 라인이 아닌 공백 문자가 포함되어 있는지 여부를 확인하고 있습니다 !/./비 빈 라인을 일치합니다. 이것과 결합 || !seen[$0]++하면 빈 줄을 제외한 모든 중복 줄을 무시하고 나머지 줄을 인쇄합니다.


나는 이것이 받아 들인 대답이어야한다고 생각합니다. 설명을 위해 +1!
— SS Anne

5
awk '/^[[:blank:]]*$/ { print; next; }; !seen[$0]++'

비어있는 (실제로 비어 있거나 비어있는) 줄을 먼저 확인하기 만하면됩니다.


5

awk@Thor의 답변과 유사하지만 덜 간결하지만 더 효율적인 또 다른 솔루션이 있습니다.

awk '!NF {print;next}; !($0 in a) {a[$0];print}' file

이것으로, 우리는 단지 a[$0]존재 여부를 확인 합니다. 그렇지 않은 경우 초기화 한 다음 인쇄하십시오. 이 경우 참조 a[$0]가 존재 하지 않을 경우 할당되지 않습니다 .


288 라인 테스트 파일을 사용하여 시차를 측정하지 않았습니다. 그러나 귀하의 코드는 확실히 가장 읽기 쉬운 상을 수상합니다.
— Sroo Stroobandt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.