Я пытался упростить заголовок, извинения, если это несколько сбивает с толку.
У меня есть файл крупного текста (Файл A) (приблизительно 13 ГБ), и я хочу отсортировать его (в Файл B) для удаления дублирующихся строк. Проблема, у меня есть ограниченная сумма пространства, таким образом, я не могу создать файл вокруг того же размера. Существует ли способ активно удалить строки, которые отсортированы из Файла A?
Мой код банка: awk ' !x[$0]++' FileA.lst > FileB.lst
Для оперативного редактирования, sed
предпочтительный инструмент. Для удаления последовательных дублирующихся строк используйте это:
sed '$!N; /^\(.*\)\n\1$/!P; D'
Если дублирующиеся строки непоследовательны, можно использовать это - но существует риск переполнения пространства буфера:
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
Поскольку sort
использует алгоритм сортировки слиянием (принимающий GNU sort
обычно используемый на Linux), риск исчерпывания памяти или диска остается, потому что сортировка слиянием может использовать много вспомогательного пространства в наихудших случаях. Кроме того риска, @thom является корректным предложением sort -u
.
Если проблема должна удалить непоследовательные дублирующиеся строки, и существует риск это sed
или оперативное sort
мог бы исчерпать пространство из-за наихудшего случая, лучшее решение состоит в том, чтобы, вероятно, переместить файл в своего рода внешнее устройство хранения данных, такое как карта флэш-памяти с интерфейсом USB.
Обратите внимание на это, если Вы не знаете ли sed
или sort
мог бы исчерпать пространство и повредить Ваш файл, Вы действительно хотите создать резервную копию файла, так или иначе. Другое решение могло бы состоять в том, чтобы отсортировать Вашу файловую систему для больших файлов, которые могут выдержать быть сжатыми и сжать достаточно из них, чтобы сделать awk '!x[$0]++' inFile > outFile
или sort -u
безопасно, в отдельный файл. Затем Вы не теряете данные, если команда перестала работать.
См. также "Полезные короткие сценарии для sed
": http://sed.sourceforge.net/sed1line.txt
Насколько я знаю, программа sort
может сортировать «на месте», это означает, что вы можете использовать тот же файл для ввода, что и для вывода. sort -u
удалит повторяющиеся строки.
команда будет выглядеть следующим образом:
sort -u mylargefile mylargefile
Конечно, может быть целесообразно сначала протестировать его на меньшем тестовом файле, прежде чем приступить к реальной работе. Особенно, если у вас нет резервной копии этого файла 13 ГБ