Сравните два файла .csv

У меня два файла: «file1» имеет идентификаторы сотрудников. «file2» имеет полную базу данных сотрудников. Вот как они выглядят:

file1

123123 222333 

file2

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

Я хочу сравнить два файла и исключить записи из файла 'file2', которые имеют идентификационные номера в файле 'file1'.

Я нашел эту команду awk, которая отлично работает:

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

Результат:

file3

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

ЗАМЕЧАТЕЛЬНО!

Моя проблема в том, что файлы на самом деле упрощены .csv файлами, и я должен использовать запятую как разделитель, а не пробел. Я пробовал все, что мог придумать, чтобы сделать эту работу (т.е. -F, -F ',' -F "," везде в команде) и не добился успеха.

Как мне заставить это работать с .csv файлами?

Кстати, я на MacBook Pro, OSX Lion!

  • Перенаправление stdout и stderr определенных строк
  • Самораспаковывающиеся скрипты: tar -xO и dd
  • Как повторить команду, когда в файле есть определенная строка?
  • Выполнение zsh rehash после сборки
  • Параллелизация цикла for с очень большим количеством итераций
  • Как объединить несколько файлов на основе метки времени
  • Как передать переменные команде awk с условиями?
  • Использование sed для замены строки со многими специальными символами?
  • 4 Solutions collect form web for “Сравните два файла .csv”

    Я предполагаю, что ваши файлы csv – это что-то вроде:

    File1

     123123,, 222333,, 

    File2

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

    Вы можете попробовать использовать команду join , например:

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

    Более подробную информацию о команде можно найти здесь: 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 

    Вы также можете попробовать следующее решение 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) 

    Попробуй это:

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

    Добавьте -F',' который говорит awk, что есть разделитель запятой или если вы используете | , использовать -F'|'

    поэтому ваш скрипт должен выглядеть так

     awk -F',' 'FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3 
    Linux и Unix - лучшая ОС в мире.