Как получить уникальные строки из очень большого файла в Linux?

У меня очень большой файл данных (255G; 3 192 563 934 строки). К сожалению, у меня только 204 ГБ свободного места на устройстве (и никаких других устройств, которые я могу использовать). Я сделал случайную выборку и обнаружил, что в заданных, скажем, 100 000 строк есть около 10 000 уникальных строк... но файл не отсортирован.

Обычно я бы использовал, скажем:

pv myfile.data | sort | uniq > myfile.data.uniq

и просто дайте ему поработать в течение дня или около того. В данном случае это не сработает, потому что на устройстве недостаточно места для временных файлов.

Я подумал, что мог бы использовать split, возможно, и выполнять потоковую передачу uniq, возможно, по 500 тысяч строк за раз в новый файл. Есть ли способ сделать что-то подобное?

Я думал, что смогу сделать что-то вроде

tail -100000 myfile.data | sort | uniq >> myfile.uniq && trunc --magicstuff myfile.data

но я не мог понять, как правильно обрезать файл.


person Sir Robert    schedule 27.07.2017    source источник
comment
Используйте sort -u, он, вероятно, разумен и будет использовать только ваши предполагаемые 10% временного пространства.   -  person that other guy    schedule 27.07.2017
comment
@thatotherguy ооо ... я не знал об этом варианте. Я попробую.   -  person Sir Robert    schedule 27.07.2017
comment
Я думаю, что проблема связана с командой сортировки, потому что вам нужен размер файла доступного пространства для его сортировки...   -  person Danilo Favato    schedule 27.07.2017
comment
@DaniloFavato Да, я тоже думаю, что проблема в этом, но мне нужно разобраться, чтобы uniq работал...   -  person Sir Robert    schedule 27.07.2017
comment
@thatotherguy Пока все хорошо ... У меня 16 ГБ через файл (осталось 3:37:50), и он использовал менее 1 ГБ места на устройстве для сортировки. Возможно, все это делается в ОЗУ, на что я и надеялся. Если вы опубликуете это как ответ, я отмечу это.   -  person Sir Robert    schedule 27.07.2017


Ответы (1)


Используйте sort -u вместо sort | uniq

Это позволяет sort отбрасывать дубликаты раньше, и GNU coreutils достаточно умен, чтобы воспользоваться этим преимуществом.

person that other guy    schedule 27.07.2017
comment
Это сработало очень хорошо для меня. В итоге он использовал незначительное дисковое пространство. - person Sir Robert; 28.07.2017
comment
В моих экспериментах казалось, что sort (GNU coreutils) 8.31 не достаточно умен, чтобы удалять последовательные дубликаты перед сортировкой. Чтобы удалить последовательные дубликаты перед сортировкой, вы всегда можете использовать uniq | sort -u. - person Socowi; 03.09.2019
comment
В настоящее время GNU sort -u удаляет дубликаты (последовательные или нет) между сортировкой и слиянием, поэтому sort -u будет использовать меньше места на диске для временного хранения. Если во входных данных много последовательных дубликатов, хорошей идеей будет первый проход с uniq. - person that other guy; 03.09.2019