Сравнить несколько сотен текстовых файлов и удалить в них дубликаты строк

Задача не совсем ясна, например если есть строка 123 в файле 1 и 2, то в каком она должна остаться? Так или иначе, можно заюзать grep: -f читает паттерны из файла, -v оставляет строки, которых не было в файле. Кроме того, можно указывать несколько файлов через grep -f file1 -f file2.

➜ ~ echo -e "1\n2" > /tmp/a
➜ ~ cat /tmp/a
1
2
➜ ~ echo -e "2\n3" > /tmp/b
➜ ~ cat /tmp/b
2
3
➜ ~ grep -v /tmp/b -f /tmp/a
3
 
к примеру на питоне, если важно не сохранить исходные файлы, а получить только уникальный контент.
на работоспособность с большими файлами не проверялось, ибо нет таких.
Код:
import os

dir_ = 'folder_name'
list_dir = os.listdir(dir_)
content = []
for fl in list_dir:
    with open(os.path.join(dir_, fl)) as f:
        content.extend(f.read().splitlines()) # помещаем все строки (из всех файлов в директории folder_name) в общий список
        f.close()
content = list(set(content)) # убираем дубли и сортируем
with open('new.txt', 'w') as f:
    f.writelines('\n'.join(content))
    f.close
 
к примеру на питоне
Код:
content = []
        content.extend(f.read().splitlines()) # помещаем все строки (из всех файлов в директории folder_name) в общий список
Может не хватить памяти, там 20 гб, нужно на всякий случай выделить подкачку соответствующего размера
 
Может не хватить памяти, там 20 гб, нужно на всякий случай выделить подкачку соответствующего размера
Зачем так извращаться? Проще делегировать контроль над уникальностью базе данных. И прогнать все файлы. Потом можно сделать выгрузку по n-кило строк в файлы.
 
в Linux так можно
find -name "*.txt" -print0 | sort -f -u --files0-from=- --output=rezultat.txt
но 20 гб оч много необходимо униколизировать файлы небольшими порциями 1-2 гб.
 
На Python 3

Кидай скрипт в каталог с файлами.
Есть фильтрация: строки с какими признаками следует брать, например, вбив @ можно отобрать только email адреса.
 

Вложения

  • TOBBOT (get only unique lines from files).7z
    994 байт · Просмотры: 9
Я бы посмотрел в сторону unix утилит uniq и sort с их помощью легко все сделать и будет очень быстро.
 
Назад
Сверху