2015-07-23 3 views
1

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

File1_pair 

20151026,1111 
20141113,2222 
20130102,3333 
77777777,9999 

File2_pair 
20151026,1111 
20203344,2222 
50506677,3333 
77777777,8888 

Desired_output 
20141113,2222,20203344 
20130102,3333,50506677 

Я пытался модифицировать ниже сценарий но не в состоянии понять это правильно.

awk 'FNR==NR { a[$0]; next } !($2) in a { c++ } END { print c }' file1_pair file2_pair` 
+0

Являются ли значения во втором столбце ** точно ** общим между двумя файлами? В том же порядке и оба имеют одинаковое значение на каждой строке? –

+0

нет, значение в столбце 2 из обоих файлов может быть разным и не совпадает с порядком. – Jimbo

+0

Но значения в столбце два по крайней мере уникальны? –

ответ

1

У вас была правильная идея, что вы просто работали на неправильных полях.

Вам необходимо сохранить все значения $2 из первого файла в массиве, а затем проверить значения $2 из второго файла в отношении этого массива. Вам также необходимо сравнить значение $1 в соответствующих строках.

Этот скрипт awk сделает это.

awk -F , -v OFS=, ' 
    NR==FNR { 
     # Store the value of $1 under the $2 key in a 
     a[$2]=$1 
     next 
    } 
    # If $2 is in a (we've seen this value before) and 
    # if the value in the array (first file's $1 value) doesn't match this files $1 value 
    ($2 in a) && (a[$2] != $1) { 
     # Print the original $1 value (from the array),$2,$1 
     print a[$2],$2,$1 
    }' file1_pair file2_pair 
+0

Спасибо, много работает! Я все еще узнаю об использовании awk с массивом. – Jimbo

+0

@Jimbo, если это сработало с вами, помните, что вы можете принять ответ. – fedorqui

+2

@fedorqui, спасибо за напоминание. Еще новичок в этом сообществе. – Jimbo