파일을 첫번째 필드를 기준으로 중복제거하여 전체필드 출력하기

프로그래밍/BASH SHELL|2020. 6. 25. 10:43
반응형

[출처] https://m.blog.naver.com/PostView.nhn?blogId=nativekim&logNo=220376409687


유닉스, 리눅스에서도 파일을 중복제거하는 기능이 있다.

 

보통 sort한후 uniq 명령어로 중복제거를 하는 방법은 많이 알고 있지만 첫번째 필드를 기준으로 중복제거를 하고

 

출력은 모두 필드가 나오도록 하는건 모르는 사람이 많다.

 

명령어의 옵션을 활용을 하면 이런 작업을 할수가 있다.

 

다음과 같은 내용의 a.txt 파일 있다.

 # cat > a.txt
11 aa xtp1
11 ab xtp2
11 ac xtp4
11 ad xtp4
11 af xtp2
22 bb xtp5
22 bp xtp5
22 bs xtp1

 

리눅스에서 uniq 옵션중에 -w 옵션이 있다. 처음부터 몇바이트가 중복기준으로 삼을건지.. -w 2 옵션을 쓰면 2바이트만 기준으로

중복을 제거한다.

cat a.txt | sort | uniq -w 2

결과

11 aa xtp1
22 bb xtp5

 

리눅스에서는 uniq옵션에 -w 옵션이 존재하지만 uniq에는 존재하지 않는것 같다. (확실치는 않음.. 모두 테스트못했음--;)

그래서 awk 구문을 이용하여 첫번째 필드를 기준으로 중복제거한후 uniq하게 모든 필드가 나오도록 로직을 만들어봤다.

 

cat a.txt |sort | awk '{if($1 != tmp1) { {tmp1 = $1} print $0 }} '

결과)

11 aa xtp1
22 bb xtp5

 

 다른 방법으로는

 

 cat a.txt |awk '!a[$1]++'

 

첫번째와 두번째필드를 모두 기준으로 하고 싶다면 다음과 같이 하면 된다.

 

 cat a.txt |awk '!a[$1,$2]++'

 

알아두면 좋을 옵션은 uniq -u 와 uniq -d 이다.

-u는 유닉스한 데이터만 출력하고 -d 는 유닉스하지 않은 데이터를 출력한다.

 

# cat > b.txt
uniq option -u check!

uniq option -d check!

uniq option -d check!

uniq option -d check!

 

전체중에 uniq한 데이터만 출력

 cat b.txt | sort | uniq -u

uniq option -u check!

 

전체중에 중복이 있는것만 출력(출력할때 uniq하게 출력됨)

 cat b.txt | sort | uniq -d

uniq option -d check!



[출처] https://m.blog.naver.com/PostView.nhn?blogId=nativekim&logNo=220376409687


반응형

댓글()