Pesquisei por esta tarefa e encontrei as seguintes perguntas mais antigas:
- Removendo duplicatas de um CSV com base em colunas especificadas
- Identifique registros exclusivos no CSV com base em colunas específicas
Mas não posso usar awk
porque meus dados são um arquivo CSV complexo com várias aspas duplas aninhadas.
Digamos que eu queira desduplicar o seguinte (caso simplificado):
Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref1,"foo, bar, base",bar
ref2,aaa,bbb
Na saída eu preciso da seguinte forma:
Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref2,aaa,bbb
Nenhuma awk
solução, por favor, apenas com qualquer analisador CSV.
Eu tentei o seguinte:
mlr --csv uniq -a -g Ref file.csv
Mas é um erro.
uniq
O subcomando de Miller retorna registros exclusivos com os campos com os quais a exclusividade foi determinada. Quaisquer outros campos são descartados. Você está recebendo um erro porque as opções do subcomando-a
(usar todos os campos) e-g
(usar campos específicos) são incompatíveis.Uma boa solução usando apenas Miller já foi dada . Usar o
head
subcomando com-n 1
enquanto agrupa noRef
campo é provavelmente a solução mais conveniente.Você também pode fazer Miller usar o mesmo tipo de operação que é comumente usado em
awk
(!seen[$1]++
), mas como Miller não possui um operador pós-incremento, será um pouco mais longo:Você também pode usar o Miller para converter os dados em JSON, depois usar
jq
para executar umaunique_by()
operação e fazer com que o Miller converta os dados de volta em CSV:você poderia correr
para obter a primeira linha agrupada por
Ref