2

У меня очень большой текстовый файл (> 50 ГБ), но большинство строк повторяются, поэтому я хочу удалить их. Есть ли способ удалить дубликаты строк из файла и обрабатывать файлы размером более 2 ГБ? Потому что каждый метод, который я нашел до сих пор, может работать только с небольшими файлами.

2 ответа2

4

Предполагается, что все строки короче 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= (также все быстрее).

0

Запустите экземпляр linux в AWS/GCE и используйте uniq. У OSX это тоже есть ...

Документы здесь: http://www.thegeekstuff.com/2013/05/uniq-command-examples/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .