compara 2 colunas de 2 arquivos csv diferentes

4

Minha intenção é comparar uma coluna específica de dois arquivos csv diferentes & obter os dados do segundo arquivo que não está lá no primeiro arquivo. Por exemplo.

Primeiro arquivo

"siddhartha",1
"mukherjee",2

Segundo arquivo

"siddhartha",1
"mukherjee",2
"unique",3

Saída esperada

"unique",3

O comando abaixo está funcionando corretamente quando o tamanho do texto da primeira coluna é limitado, portanto, no exemplo acima, ele está funcionando.

awk -F',' 'FNR==NR{a[$1];next};!($1 in a);' file1.csv file2.csv > file3.csv

mas é o tamanho do texto da primeira coluna é bastante grande (por exemplo 10000 char), não está funcionando. está cortando o texto em um certo ponto.

Alguma solução para isso?

    
por Siddhartha Mukherjee 21.11.2016 / 14:20

2 respostas

2

Com base no seu exemplo simples acima, isso deve funcionar. Ele falhará se for possível que quaisquer dados da primeira coluna possam acabar em qualquer outra coluna ou se houver algum espaço nos dados.

Usando o bash e o GNU grep.

grep -v -Ff <(cut -d',' -f 1 file1.csv) file2.csv > file3.csv

Explicação

  • -v correspondência invertida
  • -Ff usa um arquivo para uma fonte de padrões
  • <(cut -d',' -f 1 file1.csv) obtém a primeira coluna de dados e usa-a como nosso "arquivo".
por 21.11.2016 / 14:31
1

Aqui está uma solução usando não awk, mas Miller :

$ mlr --nidx join -u -j 1 --np --ur -f file1.csv file2.csv
"unique",3

Descrição:

  • --nidx , pois as colunas são indexadas posicionalmente (ou seja, não há linhas de cabeçalho)
  • -u unir opção para não exigir entradas classificadas
  • -j 1 para ingressar na coluna 1 para os arquivos à esquerda e à direita
  • --np --ur para não emitir linhas emparelhadas, mas emitem linhas não pareadas no arquivo à direita
por 21.11.2016 / 16:11

Tags