У меня есть большой отсортированный файл с миллиардами строк переменной длины. Учитывая новую строку, я хотел бы знать, какой номер байта он получит, если он будет включен в отсортированный файл.
пример
a\n
c\n
d\n
f\n
g\n
Учитывая ввод 'foo', я бы получил вывод 9.
Это легко сделать, просто просматривая весь файл, но, будучи миллиардами строк переменной длины, было бы быстрее выполнить бинарный поиск.
Такой инструмент обработки текста уже существует?
Редактировать:
Это делает сейчас: https://gitlab.com/ole.tange/tangetools/blob/master/bsearch/bsearch
text-processing
search
Оле Танге
источник
источник
Ответы:
Я не знаю ни одного стандартного инструмента, делающего это. Однако вы можете написать свой собственный. Например, следующий скрипт ruby должен сделать эту работу.
Это немного сложно, потому что после поиска вы, как правило, находитесь в середине какой-то строки и, следовательно, должны выполнить одну строку чтения, чтобы перейти к началу следующей строки, которую вы можете прочитать и сравнить с вашим ключом.
источник
sort -r
иsort -n
?(Это не правильный ответ на ваш вопрос, просто отправная точка.)
Я использовал sgrep (отсортированный grep) в аналогичной ситуации.
К сожалению (нам нужно текущее состояние), у него нет вывода со смещением байтов; но я думаю, что это может быть легко добавлено.
источник
На основе решения Michas приведем более полную программу:
https://gitlab.com/ole.tange/tangetools/blob/master/bsearch/bsearch
источник