이 작업을 검색한 결과 다음과 같은 오래된 질문을 발견했습니다.
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
awk
CSV 파서를 사용하는 것 외에는 해결책이 없습니다 .
나는 다음을 시도했다:
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 1
Ref
awk
Miller가 ( )에서 일반적으로 사용되는 것과 동일한 유형의 연산을 사용하도록 할 수도 있지만 !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