Как удалить из большого файла строки, которые есть в другом файле?
Стоит задача удалить из файла (1.txt) весом 10 гигабайт строки, которые находятся в другом файле (2.txt) весом 5 гигабайт. На компьютере при этом 8 гигабайт оперативной памяти.
Оба файла отсортированы, имеют кодировку UTF-8 без BOM, в них не содержится символа возврата каретки (\x0D или \r). Из файла 2.txt почти все строки присутствуют в файле 1.txt
Подскажите пожалуйста, есть ли для данной задачи готовые решения? Желательно под Windows, но так же можно и под Linux.
Я пробовал 3 решения:
Первое под линукс, команда comm, запускаю с параметрами: comm -23 1.txt 2.txt > out.txt и на выходе получаю в файл out.txt все строки из файла 1.txt как есть, без удаления строк содержащихся в файле 2.txt
Если же делать через grep -vf 2.txt 1.txt > out.txt то отваливается из за нехватки оперативной памяти.
Второе решение это windows утилитка findstr запускал с параметрами:
FINDSTR /V /G:C:\2.txt C:\1.txt > C:\new.txt
работает долго, где то пару суток, затем всё равно валится в ошибку.
Третье решение, через софтину TextPipe Pro, эта работает как то странно, указываю файл с которым работать, в фильтрах выбираю удалить строки, укаываю файл, из которого строки брать, в итоге выбранный файл игнорирует, как и в случае с линуксовой утилитой comm я получаю оригинальный файл 1.txt без изменений.
При этом, с маленькими объемами данных TextPipe Pro работает как надо, с чуть более крупными, например из гигового отсортировать строки которые есть в полугиговом, тут он выдаёт ошибку нехватки оперативной памяти, а с 10 гигабайтным и вовсе игнорирует операцию, делая видимость, что её выполняет.
Буду очень признателен, если кто подскажет какие решения. Я не программист, варианты написать скрипт(bash,python), или загнать всё в базу, просьба не предлагать. Так же пожелание, не предлагать вариантов которые будут удалять строки из 10 гигового файла более недели.
Если нет разделителей строк, то как вы сами разделяете их? Вы же пишите про строки.
Все стандартные команды работают построчно, а у вас строк по сути нет - у вас весь файл 1 строка на 10 Гб.
Так что не удивительно, что утилиты падают, когда пытаются прочитать сроку размеров в 10 ГБ.
res2001, я разве написал, что нету разделителей строк? Речь была про символ возврата каретки, он не является обязательным разделителем. Символы новой строки \n или \x0A разумеется присутствуют.
имхо не тривиальная задача, стандартных решений вот конкретно под это не найдешь.
мож все таки скриптом ??
даже не зная питон, за день-другой можно наковырять скрипт (имхо конечно).
я так несколько недель искал прогу с чем-то подобным - надо было кучу данных из sqlite выковырять и в отдельные файлики записать.
потом за вечер нарисовал скрипт на питоне...
Виктор Сергиенко, Ок. со строками понятно.
Значит виндовые утилиты вам точно не помогут.
Но линуксовые утилиты должны отработать. Падают, видимо, на файле 2.txt, возможно этот файл читается целиком. Что если вам 2.txt разбить на сотню другую не очень больших файлов?
Можно разделить и 1.txt, после обработки части склеить.
Разделить файлы можно с помощью tail -n/head -n или sed -n
Склеить: cat file1 file2 >fileout
Исполнять утилиты лучше под линукс с установленной кодировкой консоли UTF8.
pfg21, ну да, на питоне писать тем, кто его вообще не знает, самое то. Согласен.
А по поводу не тривиальной задачи, я при создании данного треда указал высокую сложность, однако народ проголосовал за то, что вопрос простой.
По данному вопросу, я не ищу сложных решений, подожду ещё пару деньков, может у кого какие варианты будут, кроме как советовать то, что я просил не рекомендовать.
В крайнем случае найму кодера за $$$ и тот всё сделает. Но сам ради подобной задачи становиться программистом как то не собираюсь.