정렬하지 않고 중복 행을 제거하는 방법은 무엇입니까?

정렬하지 않고 중복 행을 제거하는 방법은 무엇입니까?

행을 정렬하지 않고 중복된 행을 제거하고 싶습니다. 또한 선행 공백을 무시하고 싶습니다.

고양이 테스트.txt

 abc 

  def

pqr

      abc        

    xyz

             def 

    efg

그러면 출력은 다음과 같아야 합니다.

abc

def

pqr

xyz

efg

답변1

이 시도:

$ awk 'NF && !($1 in a){a[$1];p=$1;print (getline == 0) ? p : p"\n"}' cat
abc

def

pqr

xyz

efg

설명하다

  • NF && !($1 in a): 비어 있지 않고 값이 연관 배열에 아직 나타나지 않은 행만 처리합니다 a.
  • a[$1]: 값이 나타나지 않으면 연관 배열에 저장합니다 a.
  • p=$1;print (getline == 0) ? $1 : p"\n": 값을 변수에 저장합니다 p. 파일의 끝이 아니면 변수 p랩을 인쇄하고, 파일의 끝이 아니면 p값만 인쇄합니다.

답변2

이 명령이 작동해야 합니다.

awk '{$1=$1}1' filename | awk ' !x[$0]++'

첫 번째 awk 명령은 파일의 모든 선행 공백을 제거하고, 두 번째 awk 명령은 고유한 요소만 인쇄합니다.

답변3

삭제하고 싶다면모두중복(반복되는 빈 줄 포함)

awk '{if ($1 in a) next; a[$1]=$0; print}' test.txt

반복되는 빈 줄을 유지하려면

awk '/^$/ {print; next} {if ($1 in a) next; a[$1]=$0; print}' test.txt

답변4

명령 사용 uniquekarrick/unique:

$ cat test.txt | tr -d ' ' | unique
abc

def
pqr
xyz
efg

관련 정보