CSV 파서를 사용하여 특정 열을 기반으로 CSV 행 중복 제거

CSV 파서를 사용하여 특정 열을 기반으로 CSV 행 중복 제거

이 작업을 검색한 결과 다음과 같은 오래된 질문을 발견했습니다.

awk하지만 내 데이터가 여러 개의 중첩된 큰따옴표가 있는 복잡한 CSV 파일이기 때문에 그렇게 할 수 없습니다 .

다음과 같은 중복을 제거하고 싶다고 가정해 보겠습니다(단순화된 상황).

Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref1,"foo, bar, base",bar
ref2,aaa,bbb

출력에는 다음과 같이 필요합니다.

Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref2,aaa,bbb

awkCSV 파서를 사용하는 것 외에는 해결책이 없습니다 .

나는 다음을 시도했다:

mlr --csv uniq -a -g Ref file.csv

그러나 이것은 실수입니다.

답변1

넌 달릴 수 있어

mlr --csv head -n 1 -g Ref input.csv

다음으로 그룹화된 첫 번째 행을 가져옵니다.Ref

답변2

Miller의 uniq하위 명령은 고유한 레코드와 고유성을 결정하는 필드를 반환합니다. 다른 모든 필드는 삭제됩니다. 하위 명령의 -a(모든 필드 사용) 및 -g(특정 필드 사용) 옵션이 호환되지 않기 때문에 오류가 발생합니다.

Miller만을 사용하는 좋은 솔루션이미 주어진. with 하위 명령을 사용하는 것은 아마도 live 를 그룹화할 때 head가장 편리한 솔루션일 것입니다 .-n 1Ref

awkMiller가 ( )에서 일반적으로 사용되는 것과 동일한 유형의 연산을 사용하도록 할 수도 있지만 !seen[$1]++Miller에는 사후 증가 연산자가 없으므로 약간 더 길어집니다.

mlr --csv filter '@seen[$Ref] += 1; @seen[$Ref] == 1' file.csv

Miller를 사용하여 데이터를 JSON으로 변환한 다음 Miller를 사용하여 작업을 jq수행 unique_by()하고 Miller가 데이터를 다시 CSV로 변환하도록 할 수도 있습니다.

mlr --c2j cat file.csv | jq 'unique_by(.Ref)' | mlr --j2c cat

관련 정보