Cat 2 arquivos e evitar duplicação de linhas

1

Eu tenho o file1 com o seguinte conteúdo

{"name":"clio5", "value":"13"}
{"name":"citroen_c4", "value":"23"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"16"}
{"name":"golf3", "value":"8"}

E eu tenho o arquivo2 com o seguinte conteúdo

{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"golf4", "value":"18"}

Eu quero executar um comando shell para exibir o conteúdo do arquivo1 e do arquivo2 . Se houver um name em file1 e file2 , quero exibir apenas a linha relacionada do file2 .

A saída deve ficar assim:

$command taking account file1 file2
{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"18"}
{"name":"golf3", "value":"8"}

O comando não deve editar o arquivo1 nem o arquivo2

O comando deve ser o mais simples possível

O comando pode conter grep , sed , awk

    
por MOHAMED 22.07.2013 / 13:13

3 respostas

3

Isso não preserva a ordem das linhas, mas isso não era um requisito

awk '{line[$1]=$0} END {for (key in line) print line[key]}' file1 file2
    
por 22.07.2013 / 13:42
3
$ awk -F, 'NR==FNR{a[$1]=$0;next};$1 in a {$0=a[$1]}; 1' file2 file1
{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"18"}
{"name":"golf3", "value":"8"}

Isso pressupõe que file2 apenas atualiza entradas que já foram encontradas em file1 . Se file2 puder inserir novas entradas, você poderá alterá-lo para:

awk -F, '
  NR==FNR{a[$1]=$0;next}
  $1 in a {$0=a[$1];delete a[$1]}
  1
  END{for (i in a) print a[i]}' file2 file1

A ordem em que as entradas inseridas são exibidas não é especificada. O acima assume que existe apenas uma entrada por nome em cada arquivo.

    
por 22.07.2013 / 14:27
1

Se a ordem não for importante, esses comandos devem fazê-lo:

cat file2 file1 > files
cut -f2 -d: files | cut -f1 -d, | sort | uniq > pat
for i in $(cat pat); do grep $i files -m 1; done

O primeiro comando une os arquivos de entrada (a ordem é importante; o arquivo2 vai primeiro porque seus valores sobrescreverão os do arquivo1).

O segundo comando corta as marcas de carro dos arquivos de entrada, classifica e remove as duplicatas e as armazena no arquivo pat .

O terceiro comando agarra cada padrão no arquivo de entrada combinado e pára na primeira partida, portanto, se a mesma marca de carro aparecer em ambos os arquivos, somente aquele no arquivo2 será impresso.

Se a ordem for importante e todos os padrões estiverem no arquivo1, você poderá usar apenas file1 no segundo comando (em vez de arquivos) e omitir os comandos sort e uniq .

    
por 22.07.2013 / 13:50