파일에서 중복된 줄을 제거하는 방법은 무엇입니까?

파일에서 중복된 줄을 제거하는 방법은 무엇입니까?

문서,

TABLE1  
-------  
1234

TABLE1  
-------  
9555  

TABLE1  
-------  
87676  

TABLE1
-------  
2344

내가 원하는 출력은 다음과 같습니다

TABLE1  
-------  
1234
9555  
87676
2344

답변1

sed이것은 다음을 사용하는 라이너입니다 awk.

sed '/^$/d' 파일 이름 | awk '!a[$1]++'

grep와 다음의 조합 awk:

grep. 파일 이름 | awk '!a[$1]++'

처럼 @카스제안된 내용은 awk단일 명령을 통해 이 작업을 수행할 수도 있습니다.

awk '!x[$1]++ && ! /^[[:blank:]]*$/' 파일 이름

답변2

당신은 그것을 사용할 수 있습니다awk '!x[$1]++' file > file_new

이 명령을 시도할 때 제공한 파일에 추가 새 줄이 생겼습니다.

이를 수정했는데 awk '!x[$1]++' file | sed '/^$/d' > file_new이 경우 문제가 해결될 것입니다.

답변3

이것은 오래된 스레드이지만 단일 sed 명령만 사용하여 이 답변을 제공하고 싶습니다.

sed '1,2p;/^[[:digit:]]/!d;' file

처음 두 줄(제목과 밑줄)을 유지한 다음 숫자로 시작하지 않는 모든 줄을 삭제합니다.

답변4

명령을 사용하면 uniq중복 항목을 제거할 수 있습니다. 좋다:

cat file | sort -r | uniq

그러나 이 특별한 경우에는 파일이 작동하려면 정렬해야 하기 때문에 정확히 예상한 결과를 생성하지 않습니다. uniq인접한 중복 행만 감지합니다.
또 다른 해결책은 파일을 읽고 TABLE다음이 포함된 줄을 건너뛰는 것입니다 ----(첫 번째 항목 제외).

count_t=0
count_d=0
while read line; do 
  if [[ $line == "TABLE"* ]] ; then  
    if [[ $count_t -eq 0 ]]; then 
      ((count_t++)) 
    else
      continue 
    fi 
  fi
  if [[ $line == "-----"* ]] ; then  
    if [[ $count_d -eq 0 ]]; then 
      ((count_d++)) 
    else
      continue 
    fi
  fi
  echo $line
done < file

awk하지만 다른 사람들이 게시한 솔루션이 sed더 좋습니다.

관련 정보