awk를 사용하여 모든 빈 줄을 유지하면서 중복 줄을 제거하는 방법은 무엇입니까?

awk를 사용하여 모든 빈 줄을 유지하면서 중복 줄을 제거하는 방법은 무엇입니까?

다음 awk명령은 모든 중복 줄을 제거합니다.여기에 설명된 대로:

awk '!seen[$0]++'

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

모든 빈 줄을 유지하는 방법또한 비어 있지 않은 중복 줄을 모두 제거하고 awk?를 사용하세요. 간단한 설명도 포함하세요.

답변1

NF또 다른 옵션은 다음과 같이 확인하는 것입니다 .

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

또는 동등하게:

awk '!(NF && seen[$0]++)'

답변2

또는

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

주요 요령은 동일합니다. 키가 현재 행( )인 연관 배열 seen[$0]++에 항목을 생성하는 것입니다 . 따라서 이 줄이 보이면 그것은 거짓입니다. 공백이 아닌 문자가 포함되어 있는지 확인하기 위해 행을 검사 하므로 공백이 아닌 행이 일치됩니다. 이와 결합하면 빈 줄을 제외한 모든 중복 줄을 무시하고 나머지 줄을 인쇄합니다.seen$0!seen[$0]++/./!/./|| !seen[$0]++

답변3

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

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

a[$0]이 방법으로 존재 여부 만 확인합니다 . 그렇지 않은 경우 초기화한 후 인쇄하세요. 이 경우 참조가 없으며 a[$0]존재 여부를 지정하지도 않습니다.

답변4

논리 연산자 NOТ가 대괄호 밖으로 이동합니다.

awk '!(NF && seen[$0]++)'

관련 정보