2017-02-20 15 views
1

Оба файла имеют строки строковых и числовых данных минимум 2000 строк. Как добавить не дубликаты данных от file2.txt до file1.txt. В основном file2 имеет новые строки данных, но мы также хотим убедиться, что мы не добавляем повторяющиеся строки в файл file1.txt.Сравнение двух файлов в unix и добавление дельта к одному файлу

  • File1.txt> это основной файл данные
  • File2.txt> этот файл имеет новые данные, мы хотим добавить в file1

спасибо,

+0

Является ли порядок строк значительным? Они отсортированы? – Barmar

+0

Порядок не важен. – Vcode

ответ

4

Сортировать эти два файл вместе с -u возможность удаления дубликатов.

sort -u File1.txt File2.txt > NewFile.txt && mv NewFile.txt File1.txt 
+0

пробовал это в файле данных из 50000 строк, и с точки зрения использования памяти кажется довольно эффективным. Я получил выходной файл довольно быстро. Я думаю, что это решение для моего дела здесь. – Vcode

+0

@Barmer, что делает сортировку - фактически сортировать записи на основе? Обратите внимание, что столбцы похожи друг на друга, но некоторые разные. Также имеет ли разное расстояние между словами, что линия считается уникальной? – Vcode

+0

Сортирует записи в ключе сортировки. По умолчанию это целая строка, а пробелы значительны. Существуют опции для изменения ключа в определенных полях и игнорирования интервала и/или случая. Прочтите страницу руководства. – Barmar

1

Вы можете использовать grep, как это:

# grep those lines from file2 which are not in file1 
grep -vFf file1 file2 > new_file2 
# append the results to file1 
cat new_file2 >> file1 
+0

Хм. С точки зрения использования памяти это пахнет потенциально дорого. ('sort' может нарушить работу, чтобы сохранить фрагменты на диске, если для этого потребуется больше памяти, чем доступно, но я не уверен, как будет работать' grep', если он пытается сохранить список шаблонов или построить regex из списка источников, которые являются исключительно большими). –

+0

С другой стороны, это сохраняет существующий порядок строк и не тратит время на сортировку. В зависимости от варианта использования это может быть лучшим решением или единственным правильным из этих трех ответов. – hek2mgl

+0

Справедливый аргумент. Если бы я был OP, и этот метод был единственным способом изменения моего файла с течением времени, я бы, вероятно, съел расходы на сортировку файла * один раз *, а затем с помощью метода 'comm' с этого момента ... но вы правы, здесь есть прецедент для всего. –

2

Другой вариант если файл отсортирован, просто есть выбор (и мне нравится comm :))

comm --check-order --output-delimiter='' -13 File1.txt File2.txt >> File1.txt 
+0

@CharlesDuffy: true, это предполагает, что отсортировано действительно. – Wrikken

+0

* кивок *. Определенно наиболее эффективный подход, если ваши файлы предварительно отсортированы. (Хорошо - можно было бы также использовать подход Barmar с флагом-сопоставлением GNU-типа, я полагаю, но я ожидал бы, что в этом случае они будут примерно эквивалентны по производительности). –

+0

@Wrikken файл в этом случае не отсортирован. интересно, что такое «-13» в вашем скрипте? – Vcode

1

использование awk:

awk '!a[$0]++' File1.txt File2.txt 
+0

Какое преимущество имеет это в отношении уже существующих подходов? Он неэффективен для памяти - даже более, чем подход «grep -vf», поскольку в нем хранятся даже строки, найденные только во втором файле в памяти, тогда как в нем могут храниться только строки из существующего файла - и я не уверен какие выгоды он добавляет. –

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

  • Нет связанных вопросов^_^