2013-08-26 5 views
0

내가 3 열제거 중복

나는 세 번째 열에서 중복 된 값을 포함하는 행을 제거해야
A  0 3238 
B  0 3367 
C  0 3130 
D  1 3130 

가있는 데이터 집합에서 중복을 제거 할 수 있지만 우선적으로 가진 사람을 유지하고자하는 조건 AWK/bash에 기반으로 두 번째 열의 값은 '1'입니다. awk를 사용하여 중복을 제거하는 방법을 알고 있지만 조건문을 추가하는 방법을 배울 수 없습니다.

감사

답변

3

이 줄을 시도해은 :

awk '{if($3 in a)a[$3]=$2==1?$0:a[$3];else a[$3]=$0}END{for(i in a)print a[i]}' file 
+0

감사합니다,이 작동하는 것 같다! – tclarke

+0

@tclarke pls가 대답을 수락합니다. – user1502952

+0

+1 그것을 해결하기위한 깔끔한 방법. 나는'$ 2 == 1? $ 0 : a [$ 3]'이 '='소원이 약간 혼동되기 전에 평가된다는 것을 처음에는 깨닫지 못했습니다. 나는'$ [$ 3] = ($ 2 == 1 $ 0 : a [$ 3]) '도 잘 작동한다고 생각합니다. – Qben

3
$ sort -k2nr file | awk '!seen[$3]++' 
D  1 3130 
A  0 3238 
B  0 3367 
+1

'awk'의 재미있는 비트. '! seen [$ 3] ++'부분을 설명해 주시겠습니까? – iamauser

+1

일련의 잠재적 중복에서 첫 번째 값만 출력하는 것은 일반적인 awk 관용구입니다. 값이 배열의 인덱스로 사용 될 때마다 그 값에 대한 배열의 엔트리는 사후 증가되며, 처음 값이 보일 때 배열 엔트리는 0이므로 '!'연산자는 전체 결과를 true로 만듭니다. 배열 엔트리가 0이 아니지만 첫 번째 이후에는'! '가 결과를 false로 만듭니다. 그것은 '유니크 (uniq)'와 비슷하지만, 값을 정렬 할 필요가 없으며 전체 입력 행/레코드보다는 필드에서 조작하게됩니다. –