Compare dois arquivos .csv

3

Eu tenho dois arquivos: 'file1' tem números de identificação de funcionário. 'file2' tem o banco de dados completo dos funcionários. Aqui está o que parecem:

arquivo1

123123
222333

arquivo2

111222 Jones Sally
111333 Johnson Roger
123123 Doe John
444555 Richardson George
222333 Smith Jane
223456 Alexander Philip

Eu quero comparar os dois arquivos e eliminar as entradas do 'arquivo2' que possuem números de ID no 'arquivo1'.

Eu encontrei este comando 'awk' que funciona perfeitamente:

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

O resultado:

file3

111222 Jones Sally
111333 Johnson Roger
444555 Richardson George
223456 Alexander Philip

MARAVILHOSO!

Meu problema é que os arquivos são realmente simplificados em .csv files, e devo usar uma vírgula como um separador, em vez de um espaço. Eu tentei tudo o que posso pensar para fazer este trabalho (ou seja, -F, -F ',' -F "," em todos os lugares no comando) e nenhum sucesso.

Como faço para que isso funcione com .csv arquivos?

A propósito, estou no MacBook Pro, OSX Lion!

    
por pgrason 13.02.2015 / 04:01

4 respostas

2

Estou supondo que seus arquivos csv sejam semelhantes a:

Arquivo1

123123,,
222333,,

Arquivo2

111222,Jones,Sally
111333,Johnson,Roger
123123,Doe,John
444555,Richardson,George
222333,Smith,Jane
223456,Alexander,Philip

Você pode tentar usar o comando join da seguinte forma:

# join -t, -v 2 <(sort file1) <(sort file2)
111222,Jones,Sally
111333,Johnson,Roger
223456,Alexander,Philip
444555,Richardson,George

Mais informações sobre o comando podem ser encontradas aqui: man join

join [OPTION]... FILE1 FILE2

-t CHAR
    use CHAR as input and output field separator 
-v FILENUM
    like -a FILENUM, but suppress joined output lines 
    
por 13.02.2015 / 04:56
2

Tente isto:

awk 'BEGIN{FS=","};FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3
    
por 13.02.2015 / 06:29
1

Você também pode tentar a seguinte solução Python2:

#!/usr/bin/env python2
import csv
with open('file_1') as f1:
    file_1_list = [line[0] for line in csv.reader(f1)]
with open('file_2') as f2:
    for line in csv.reader(f2):
        if line[0] not in file_1_list:
            print ' '.join(line)
    
por 13.02.2015 / 05:37
0

Adicione o -F',' que diz ao awk que existe um delimitador de vírgula ou se você está usando | . use -F'|'

para que seu script fique assim agora

awk -F',' 'FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3
    
por 21.04.2016 / 00:09