У меня очень большой текстовый файл (> 50 ГБ), но большинство строк повторяются, поэтому я хочу удалить их. Есть ли способ удалить дубликаты строк из файла и обрабатывать файлы размером более 2 ГБ? Потому что каждый метод, который я нашел до сих пор, может работать только с небольшими файлами.
2 ответа
Предполагается, что все строки короче 7 КБ, и что у вас установлены bash, dd, tail, head, sed и sort из cygwin/unix:
{
i=0
while LANG= dd 2>/dev/null bs=1024 skip=${i}000 if=large_text_file count=1021 \
| LANG= sed -e '1d' -e '$d' | LANG= sort -u ;
do
i=$((1+$i))
done
LANG= dd 2>/dev/null bs=1024 skip=${i}000 if=large_text_file count=1021 \
| LANG= tail -n 1
LANG= head -n 1 large_text_file
} | LANG= sort -u > your_result
Это делит файл на куски по 1024000 байт и добавляет также 3 * 7 * 1024 байт ("21" в 1021
) из следующего куска. Поскольку подразделения могут разрезать строку, первая (1d
) и последняя ($d
) строки каждого фрагмента уничтожаются (sed
).
Таким образом, чтобы компенсировать, что-то, содержащее последний кусок, извлекается снова и сохраняется только его последняя строка (tail -n 1), и первая строка также извлекается снова (head -n 1).
Когда цикл терпит неудачу, последний кусок был извлечен.
sort -u
может рассматриваться как компрессор, но он только сортирует свои данные и пропускает дубликаты.
Первая "сортировка" сжимает все куски. Второй sort
снова сжимает конкатенации всех этих кусков (и этот второй sort
отсутствует в коде выше со времени третьего редактирования, извините).
Вы сказали, текстовый файл, но я все равно предполагаю двоичный файл, следовательно, LANG=
(также все быстрее).
Запустите экземпляр linux в AWS/GCE и используйте uniq. У OSX это тоже есть ...
Документы здесь: http://www.thegeekstuff.com/2013/05/uniq-command-examples/