2015-01-14 1 views
0

여러 열을 기반으로 파일에서 중복 된 항목을 모두 제거하고 싶습니다. 장난감 예가 있습니다 :Unix의 파일에서 중복 된 파일을 모두 지우는 중

첫 번째 4 개 열을 통해 고유성이없는 모든 레코드를 삭제하고 싶습니다. 모두를 성공적으로 속는을 제거

awk -F"," -v OFS="," '{cnt[$1,$2,$3,$4]++} END {for (rec in cnt) if (cnt[rec] == 1) print rec}' ss.txt 

하지만, 올바른 구분 기호 또는 인쇄를 적용하지 않습니다

BLUE,CAR,RED,HOUSE,40 
    BLUE,CAR,BLACK,HOUSE,20 
    BLUE,CAR,GREEN,HOUSE,10 
    BLUE,TRUCK,RED,HOUSE,40 
    BLUE,TRUCK,GREEN,HOUSE,40 
    BLUE,TRUCK,RED,HOUSE,40 

내가 시도

BLUE,CAR,RED,HOUSE,40 
    BLUE,CAR,BLACK,HOUSE,20 
    BLUE,CAR,GREEN,HOUSE,10 
    BLUE,TRUCK,GREEN,HOUSE,40 

발생해야 : 그래서에 awk 스크립트를 적용 전체 기록 :

BLUECARREDHOUSE 
    BLUETRUCKGREENHOUSE 
    BLUECARBLACKHOUSE 
    BLUECARGREENHOUSE 

awk 솔루션을 선호하지만 휴대용 솔루션을 환영합니다.

+0

추가 데이터를 첫 번째 레코드의 40 개에 넣으시겠습니까? –

+0

예, 중복 된 값이 처음 네 개의 필드에만 설정되어 있어도 전체 레코드가 인쇄되어야합니다. – mlegge

답변

3

첫 번째 4 열의 고유 한 레코드에 대한 전체 기록을 원하는,이 작업 할 것 감안할 때 :

awk -F',' '{cnt[$1,$2,$3,$4]++;line[$1,$2,$3,$4] = $0} 
      END {for (rec in cnt) if (cnt[rec] == 1) print line[rec]}' \ 
    ss.txt 

저장 라인뿐만 아니라 수를; 당신이 입력 한 것을 돌려 받으십시오. 기가 바이트 파일을 가지고 있다면 고통스러워집니다. 원하는 경우에만 고유 한 행을 저장하는 방법이 있습니다. 이 명령은 각 행의 첫 번째 버전 만 저장하고 고유하지 않은 것으로 알려진 항목을 삭제합니다. (테스트되지 않은 -..하지만 난 그것을 작동한다고 생각 Ed Morton에서 comment 당 수정)

awk -F',' '{ if (cnt[$1,$2,$3,$4]++ == 0) 
       line[$1,$2,$3,$4] = $0 
      else 
       delete line[$1,$2,$3,$4] 
      } 
      END {for (rec in line) print line[rec]}' \ 
    ss.txt 

만 4 키 열을 원하는 경우,이 단지 쉼표로 구분 된 형식으로 4 열을 저장 당신은거야 인쇄 :

awk -F',' '{cnt[$1,$2,$3,$4]++;line[$1,$2,$3,$4] = $1 "," $2 "," $3 "," $4} 
      END {for (rec in cnt) if (cnt[rec] == 1) print line[rec]}' \ 
    ss.txt 
+0

테스트되지 않은 경우, 다시 'cnt'를 테스트 할 필요가 없습니다. END 섹션을 만들면됩니다. END (끝내려면 (rec in line)) print line [rec]}' –

+1

@EdMorton : 예. (엄밀히 말하자면, 그것들은 모두 테스트되지 않았지만, 그것이 내가 가장 잘 모르는 것이었고, 다른 것들은 경험을 바탕으로 훌륭하게 보였습니다.) 그리고 나는 컴파일 사이의 대답을 짜내고있었습니다. –

+0

FWIW (cnt [rec] = 0)에 대한 (rec에서 cnt) BEGIN {FS = SUBSEP = ","} {cnt [$ 1, $ 2, $ 3, = 1) print rec} '' –

관련 문제