Величезний (до 2 ГБ) мій текстовий файл містить близько 100 точних дублікатів кожного рядка в ньому (в моєму випадку непотрібний, оскільки файл - це таблиця даних, схожа на CSV).
Що мені потрібно - це видалити всі повтори, при цьому (бажано, але це може бути пожертвовано для значного підвищення продуктивності), підтримуючи початковий порядок послідовностей. В результаті кожен рядок повинен бути унікальним. Якщо було 100 рівних рядків (як правило, дублікати розводяться по файлу і не будуть сусідами), залишиться лише один із виду.
Я написав програму в Scala (вважайте Java, якщо ви не знаєте про Scala) для її реалізації. Але, можливо, існують швидші рідні інструменти, написані на C, які здатні це зробити швидше?
ОНОВЛЕННЯ: awk '!seen[$0]++' filename
рішення, здавалося, спрацювало нормально, доки файли були біля 2 Гб або менше, але тепер, коли я прибираю файл з 8 Гб, він більше не працює. Здається, що безліч нескінченностей на Mac із 4-гігабайтною оперативною пам’яттю та 64-розрядному ПК Windows 7 з 4 гігабайтами оперативної пам’яті та підмінами 6 GiB просто не вистачає пам'яті. І я не відчуваю ентузіазму пробувати це на Linux з 4-мегабайтною оперативною пам’яттю, враховуючи цей досвід.
sort -u
швидше за все, буде швидше.