2011-02-09 7 views
4

특정 필드가 중복되는 줄을 제거하려면 sort -u -k n, n을 사용하십시오. 그러나 이것은 한 번 발생합니다. 만약 내가 중복을 모두 제거하고 싶다면 거기에 어떤 빠른 bash 또는 awk 방법이 무엇입니까?중복되는 줄의 모든 항목 제거

예는 내가 가진 :

1 apple 30 
2 banana 21 
3 apple 9 
4 mango 2 

내가 원하는 :

2 banana 21 
4 mango 2 

내가 미리 정렬 한 후 펄이 아니라 V의 해시를 사용하는 큰 파일이 느리게 될 것입니다..

답변

2

sort -k <your fields> | awk '{print $3, $1, $2}' | uniq -f2 -u | awk '{print $2, $3, $1}'을 시도하면 복제 된 모든 줄이 제거됩니다 (복사본을 유지하지 않음). 마지막 필드가 필요하지 않으면 먼저 awk 명령을 cut -f 1-5 -d ' '으로 변경하고 을 uniq, -f1으로 변경하고 두 번째 awk 명령을 제거하십시오. 이것은 당신의 입력과 같은 순서로 출력을 유지합니다

+0

는 UNIQ는'UNIQ -u'와 같은 종류의 -u 같은 방식으로 – annavt

+0

하지 작동; 그것은'sort -u'와는 달리 당신이 원하는 것을합니다. –

+0

뭔가 빠졌습니까?'$ sort ~/Desktop/fruit.txt | awk '{print $ 3, $ 1, $ 2}'| 유니크 -f1 -u | awk '{인쇄 $ 2, $ 3, $ 1}' 사과 1 개 2 바나나 21 사과 3 4 망고 2 $ sort -k2,2 ~/Desktop/fruit.txt | awk '{print $ 3, $ 1, $ 2}'| 유니크 -f1 -u | AWK는 1 사과 '{$ 2, $ 3, $ 1 인쇄}'30 3 사과 (9) 2 바나나 (21) 4 대답은 버그를 가지고 2 ' – annavt

3

:이 작동 생각하지 않는다

awk '{seen[$2]++; a[++count]=$0; key[count]=$2} END {for (i=1;i<=count;i++) if (seen[key[i]] == 1) print a[i]}' inputfile 
+0

좋아,이 작품 – annavt