сравнение 2 больших несортированных файлов CSV на основе 2 столбцов - PullRequest
1 голос
/ 09 августа 2011

Я занимаюсь сравнением 2 больших несортированных .csv файлов на основе столбцов 1 и 3. Каждый файл содержит около 200 тыс. Записей.Для вывода мне нужно знать, какие записи на основе столбцов 1 и 3 существуют в первом файле, но не во втором файле.Файлы заключаются в кавычки, разделенные запятыми.Столбец 3 должен игнорировать регистр при сравнении.

Файл примера 1:

"id", "name", "email", "country"
"1233",  "jake", "jake@mailinator.com", "USA"
"2345", "alison", "Alison@mailinator.com", "Canada"
"3456", "jacob", "jacob@mailinator.com", "USA"
"5678", "natalia", "natalia@mailinator.com", "USA"

Файл 2

"id", "name", "email", "country"
"2345", "alison", "alison@mailinator.com", "Canada"
"3456", "jacob", "jacob@mailinator.com", "USA"
"5690", "lina", "lina@mailinator.com", "Canada" 

требуемый файл вывода

"5678", "natalia", "natalia@mailinator.com", "USA"

Примеры кода будут очень полезны.

Ответы [ 5 ]

1 голос
/ 09 августа 2011

Попробуйте:

join -v 1 -i -t, -1 1 -2 1 -o 1.2 1.3 1.4 1.5  <(awk -F, '{print $1":"$3","$0}' f1.txt | sort) <(awk -F, '{print $1":"$3","$0}' f2.txt | sort)

Как это работает:

1) Сначала я создаю столбец составного ключа, соединяя столбец 1 и столбец 3:

awk -F, '{print $1":"$3","$0}' f1.txt
awk -F, '{print $1":"$3","$0}' f2.txt

2) Я сортирую оба вывода:

awk -F, '{print $1":"$3","$0}' f1.txt | sort 
awk -F, '{print $1":"$3","$0}' f2.txt | sort 

3) Затем я использую команду join, чтобы присоединиться к первому столбцу (мой составной ключ) и вывести непересекающиеся строки из файла 1.

Выход:

"1233",  "jake", "jake@mailinator.com", "USA"
"5678", "natalia", "natalia@mailinator.com", "USA"
0 голосов
/ 10 августа 2011
awk 'BEGIN { FS=OFS=","}; NR==FNR{a[tolower($1$3)]=++i;next} { if ( tolower($1$3) in a);else {print } }' file2 file1

вывод:

"1233",  "jake", "jake@mailinator.com", "USA"
"5678", "natalia", "natalia@mailinator.com", "USA"
0 голосов
/ 09 августа 2011

Загрузить содержимое файла в базу данных в памяти, например, H2 и использовать выбор SQL с объединением

0 голосов
/ 09 августа 2011
awk 'BEGIN { FS="\", \""}
     FNR == 1 {read++;}
     FNR !=1 {if (read==1) {store[$1","tolower($3)] = $0} if (read==2) {delete store[$1","tolower($3)]}}
     END {for (i in store) {print store[i]}}' file1 file2

Выход:

"1233",  "jake", "jake@mailinator.com", "USA"
"5678", "natalia", "natalia@mailinator.com", "USA"
0 голосов
/ 09 августа 2011

Зацикливание файлов, загрузка их в 2 массива (или, может быть, хэши), а затем зацикливание второго файла, массив каждой строки. Если array1[n] и array2[n] отсутствуют в массиве текущей строки, выводится как отсутствующий. Я бы использовал Perl для этой задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...