awk: apague as linhas onde os campos 1 e 2 são duplicados [duplicados]

0

Exemplo de arquivo com linhas duplicadas:

 # more  file.csv

 spark2-env,spark_thrift_cmd_opts,--driver-memory 15g --executor-cores 7
 spark2-thrift-sparkconf,spark.memory.offHeap.enabled,true
 mapred-site,yarn.app.mapreduce.am.command-opts,-Xmx5324m -Dhdp.version=${hdp.version}
 spark2-env,spark_thrift_cmd_opts,--driver-memory 15g --executor-cores 7

Criamos o seguinte awk para excluir as linhas com strings duplicadas apenas nos campos 1 e 2, mas o awk de algum motivo não claro também exclui a linha onde o campo 3 é duplicado.

O que há de errado com minha sintaxe awk?

 # awk -F, 'NR==FNR{a[$1,$2]++; next} a[$1,$2]==1'  blueprint_param_file.csv  blueprint_param_file.csv

 spark2-thrift-sparkconf,spark.memory.offHeap.enabled,true
 mapred-site,yarn.app.mapreduce.am.command-opts,-Xmx5324m -Dhdp.version=\${hdp.version}

Resultado esperado:

spark2-env,spark_thrift_cmd_opts,--driver-memory 15g --executor-cores 7
spark2-thrift-sparkconf,spark.memory.offHeap.enabled,true
mapred-site,yarn.app.mapreduce.am.command-opts,-Xmx5324m -    
    
por yael 29.08.2017 / 16:17

1 resposta

3

Não há necessidade de processar o mesmo arquivo duas vezes, basta aplicar a seguinte lógica:

awk -F, '!a[$1,$2]++' blueprint_param_file.csv
  • !a[$1,$2]++ - garante que uma chave crucial (concatenação do primeiro e do segundo campo) ocorre somente uma vez na matriz a , excluindo assim duplicatas

A saída:

spark2-env,spark_thrift_cmd_opts,--driver-memory 15g --executor-cores 7
spark2-thrift-sparkconf,spark.memory.offHeap.enabled,true
mapred-site,yarn.app.mapreduce.am.command-opts,-Xmx5324m -Dhdp.version=${hdp.version}
    
por 29.08.2017 / 16:21