빈 줄을 유지하면서 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.