Як видалити дублікати текстових ліній з файлів більше 4 Гб?


5

Я шукаю з відкритим вихідним кодом (можливо, 64 біт) вікна текстовий редактор, який дозволить мені видалити дублікати рядків з дуже великий (4 Гб +) текстовий файл.

Що ви використовуєте для видалення дублікатів рядків з великих текстових файлів?


1
дублікати .. що? слова? рядків слів? надати зразок (значно коротший, ніж 4gb)
akira

Додано тег Windows, оскільки це специфічне для Windows питання.
Sasha Chedygov

Відповіді:


4

sort -u file > outfile

Зручний портал Win32 sort є в UnxUtils

Для більш складних значень "видалення дублікатів" є Perl (et al).


Дякуємо за відповідь, але UnxUtils був недоступний для завантаження, коли я спробував її виконати.
darkAsPitch

1
Ви можете завантажити UnxUtils з sourceforge.net/projects/unxutils/files/unxutils/current/…
RedGrittyBrick

Це, здається, не працює для великих файлів, на жаль, є помилка (я думаю) в UnxUtils і він скаржиться на те, що не в змозі прочитати з / tmp / & lt; temp_file & gt; ...
Gordon Carpenter-Thompson

@Gordon: Цікаво. Наскільки великим є "великий" у Мб або GB? і яка O / S і файлова система, скільки вільного місця?
RedGrittyBrick

ОС була Windows 2008 R2 Datacenter працює на веб-службах Amazon. Файл мав близько 2 Гб. Це лише невеликий екземпляр, тому він міг бути обмежений RAM / diskspace. Можливо, повідомлення про помилку вводить в оману. Я відмовився і отримав його відсортовані за допомогою порту cygwin на тому ж екземплярі.
Gordon Carpenter-Thompson

2

Якщо у вас є Cygwin або MinGW, ви могли б виконати це з

cat file | sort | uniq >> outfile

припускаючи, що вам потрібні унікальні рядки. Я не знаю, як це буде виконуватися, оскільки сортування набору даних, яке велике, ймовірно, займе тривалий час (або, якщо воно вже відсортоване, можна просто залишити цю частину) або як саме ці команди функціонують (якщо вони споживатимуть 4 Гб баран чи ні).


Дякую! CygWin і команда sort були саме те, що мені потрібно!
darkAsPitch

0

Ви можете видалити дублікати рядків у величезному файлі за допомогою PilotEdit.


0

Я також розмістив цю відповідь на дублікат питання & gt; 50 Гб файлів

Припускаючи, що всі рядки коротше, ніж 7kB, а у вас є bash, dd, tail, head, sed і сортування встановлено з 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 = (все стає все швидше).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.