2015-12-21 2 views
1

Требование, чтобы сравнить два огромных файлов Unix и писать разницу в третий файл, основанный на уникальном ключе (первое поле) после поиска несколько вариантов получили следующую команду:Сравнение двух больших файлов в Unix

awk 'FNR==NR{a[$0];next}!($0 in a)' hosts.csv masterlist.csv>results.csv 

Хотя это дает различия, если для поля один файл содержит NULL (как слово) и другое пустое/пространство для нулевых значений, как игнорировать это в команде и сравнивать другие поля?

Также хотел бы сделать общий сценарий или утилиту с такими параметрами, не нуждаться в коде, но только предложение было бы полезно.

+0

Является 'diff' не вариант? –

+1

Пожалуйста, напишите [mcve], иначе это слишком абстрактно, чтобы знать, что вы ищете. – fedorqui

+1

@commuSoft: попробовал с sdiff -W ... Но нужно также игнорировать Null .. Так что проверял, есть ли у нас лучший метод. – Vinod

ответ

0

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

2

Вы можете попробовать это исправить в вашем awk:

awk 'FNR==NR{if ($0 !~ /NULL| *|^$/){a[$0]}next}!($0 in a)' hosts.csv masterlist.csv>results.csv 

Как @fedorqui предложить в комментариях, вот еще одна альтернатива:

awk 'FNR==NR{if ($0 !~ /NULL/ && NF){a[$0]}next}!($0 in a)' hosts.csv masterlist.csv>results.csv 
+0

Попробуем это и обновим ... – Vinod

+1

Возможно, вы можете проверить 'NF', чтобы избавиться от пустых строк или просто пробелов. – fedorqui

+0

Nice catch @fedorqui – klashxx

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