imprime as linhas duplicadas somente nos campos 1,2 do arquivo csv

1

pelo seguinte comando podemos imprimir as linhas duplicadas do arquivo

uniq -d string file.txt

mas como podemos fazer isso no arquivo csv?

precisamos imprimir as linhas duplicadas apenas nos campos 1,2 do arquivo csv - não incluir o campo 3

FS - ","

por exemplo:

 spark2-thrift-sparkconf,spark.history.fs.logDirectory,{{spark_history_dir}}
 spark2-thrift-sparkconf,spark.history.fs.logDirectory,true
 spark2-thrift-sparkconf,spark.history.Log.logDirectory,true
 spark2-thrift-sparkconf,spark.history.DF.logDirectory,true

resultados esperados:

 spark2-thrift-sparkconf,spark.history.fs.logDirectory,{{spark_history_dir}}
 spark2-thrift-sparkconf,spark.history.fs.logDirectory,true

segundo:

como excluir as linhas duplicadas do arquivo csv (eu quero excluir apenas as linhas duplicadas nos campos 1,2

resultado esperado:

 spark2-thrift-sparkconf,spark.history.Log.logDirectory,true
 spark2-thrift-sparkconf,spark.history.DF.logDirectory,true
    
por yael 22.08.2017 / 10:01

3 respostas

1
$ awk -F, 'NR==FNR{a[$1,$2]++; next} a[$1,$2]>1' file.txt file.txt 
spark2-thrift-sparkconf,spark.history.fs.logDirectory,{{spark_history_dir}}
spark2-thrift-sparkconf,spark.history.fs.logDirectory,true

Processamento de dois arquivos usando o mesmo arquivo de entrada duas vezes

  • NR==FNR{a[$1,$2]++; next} usando os dois primeiros campos como chave, salve o número de ocorrências
  • a[$1,$2]>1 imprime apenas se a contagem for maior que 1 durante a segunda passagem


Para o caso oposto, simples questão de mudar a condição verificar

$ awk -F, 'NR==FNR{a[$1,$2]++; next} a[$1,$2]==1' file.txt file.txt 
spark2-thrift-sparkconf,spark.history.Log.logDirectory,true
spark2-thrift-sparkconf,spark.history.DF.logDirectory,true
    
por 22.08.2017 / 10:23
0

cut os primeiros dois campos, uniq deles conforme sugerido e use o resultado para grep das linhas no arquivo original:

cut -d, -f1,2 file.cvs |uniq -d|grep -Ff - file.cvs

Se o arquivo ainda não estiver classificado, você deverá classificá-lo antes do uniq :

cut -d, -f1,2 file.cvs |sort|uniq -d|grep -Ff - file.cvs

Para a segunda pergunta (resultado invertido), use a opção -u em vez de -d :

cut -d, -f1,2 file.cvs |sort|uniq -u|grep -Ff - file.cvs
    
por 22.08.2017 / 10:11
0
Solução

awk :

- para imprimir as linhas duplicadas apenas nos campos 1,2 do arquivo csv

awk -F, '$1==f1 && $2==f2{ printf "%s,%s,%s\n%s\n", f1,f2,f3,$0 }
        { f1=$1; f2=$2; f3=$3 }' <(sort -t, -k1,1 -k2,2 file.txt)

A saída:

spark2-thrift-sparkconf,spark.history.fs.logDirectory,{{spark_history_dir}}
spark2-thrift-sparkconf,spark.history.fs.logDirectory,true

- exclui as linhas duplicadas do arquivo csv (nos campos 1,2)

awk -F, 'f1 && f2{ if($1!=f1 || $2!=f2) { printf "%s,%s,%s\n", f1,f2,f3 } else next }
        { f1=$1; f2=$2; f3=$3 }' <(sort -t, -k1,1 -k2,2 file.txt)

A saída:

spark2-thrift-sparkconf,spark.history.DF.logDirectory,true
spark2-thrift-sparkconf,spark.history.fs.logDirectory,{{spark_history_dir}}
    
por 22.08.2017 / 10:29