Вид FileA в FileB при активном удалении строк из FileA

Я пытался упростить заголовок, извинения, если это несколько сбивает с толку.

У меня есть файл крупного текста (Файл A) (приблизительно 13 ГБ), и я хочу отсортировать его (в Файл B) для удаления дублирующихся строк. Проблема, у меня есть ограниченная сумма пространства, таким образом, я не могу создать файл вокруг того же размера. Существует ли способ активно удалить строки, которые отсортированы из Файла A?

Мой код банка: awk ' !x[$0]++' FileA.lst > FileB.lst

1
задан 1 December 2013 в 03:23

2 ответа

Простой ответ: последовательные дублирующиеся строки

Для оперативного редактирования, 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

1
ответ дан 1 December 2013 в 03:23

Насколько я знаю, программа sort может сортировать «на месте», это означает, что вы можете использовать тот же файл для ввода, что и для вывода. sort -u удалит повторяющиеся строки.

команда будет выглядеть следующим образом:

sort -u mylargefile mylargefile

Конечно, может быть целесообразно сначала протестировать его на меньшем тестовом файле, прежде чем приступить к реальной работе. Особенно, если у вас нет резервной копии этого файла 13 ГБ

0
ответ дан 1 December 2013 в 03:23

Другие вопросы по тегам:

Похожие вопросы: