2016-06-21 3 views
0

У меня есть два очень больших файла в Unix, каждый из которых содержит 5 столбцов, но миллионы строк.Сравнение двух файлов по полю в Unix

Ex:

Файл 1: а | Защита | ГКИ | IJK | ЛМНЫ .... ...

File2: а | Защита | ГКИ | IJK | 123 . .. ...

Моя задача - сравнить два больших файла и узнать разные столбцы и строки. Например, выход будет: Column-no Row-no File1-word File2-word.

Ex:

5 1 ЛМН 123

файлы действительно большой. Я слышал, что awk - это самый быстрый способ разбора файлов в Unix. Поскольку выход не может ждать слишком долго.

Можно ли это сделать с помощью awk?

+0

Да, это можно сделать с помощью 'awk' - хотя чтение из двух файлов одновременно затруднено, но сохранение всего ввода из одного файла, а затем использование этого при чтении второго является обычным режимом работы для скриптов' awk'. Что вы пробовали, и где у вас возникли проблемы? Если вы можете использовать Perl или Python, вам будет легче избежать разрыва всего одного файла в памяти. –

+0

Даже если я использую Perl, мне по крайней мере придется клонировать один файл в памяти? И затем используйте эту структуру данных для сравнения второго файла –

+0

No; используя Perl, вы должны прочитать одну строку из файла 1 и одну строку из файла 2, а затем сравнить эти строки и распечатать различия; промыть и повторить. –

ответ

2

paste/awk решение

$ paste -d'|' file1 file2 | 
    awk -F'|' '{w=NF/2; 
       for(i=1;i<=w;i++) 
       if($i!=$(i+w)) printf "%d %d %s %s", NR,i,$i,$(i+w); 
       print ""}' 

1 5 lmn 123 

Я изменил порядок, это имеет смысл для меня, чтобы напечатать номер строки первой, то номер поля, однако вы можете изменить его легко ...

После вставки спичек строки из двух файлов переходят в поле первой половины (первый файл) и сравниваются со второй половиной (второй файл) и печатают отличия. awk имеет неявный цикл для всех записей (строк). Я не тестировал это с большими файлами, но для awk часть не имеет значения (запись по записи). Я не уверен, как нетерпелив paste, но я сомневаюсь, что он будет мигать.

+0

Я не слишком разбираюсь в awk. Можете ли вы объяснить, как это делается? Также этот процесс будет работать эффективно даже в случае очень больших файлов. –

+1

@SubhayanBhattacharya: команда 'paste' помещает копию строки 1 из файла1 в ту же строку, что и строка 1 из файла2, разделенная по '' '(из-за' -d '|' '). Затем команда 'awk' работает через поля, сравнивая и печатая при необходимости. Если в 'file1' есть 5 полей, в строке ввода 10; 'w' = 5; он сравнивает «$ 1 с« $ 6 »,« $ 2 »с' $ 7' и т. д., сообщает о различиях. –

Смежные вопросы