Как получить случайный раздел в середине огромного файла?
У меня огромный лог-файл размером около 3,5 ГБ, и я хотел бы отобрать случайные разделы в середине, скажем, 10 МБ для отладки того, что делает мое приложение.
Я мог бы использовать команды head или tail, чтобы получить начало или конец файла, как я могу получить произвольную часть от середины файла? Я думаю, я мог бы сделать что-то вроде head -n 1.75GB | tail -n 10MB
но это кажется неуклюжим, и мне нужно определить номера строк для средней точки файла, чтобы получить количество строк в 1,75 ГБ и 10 МБ.
3 ответа
$ dd if=big_file.bin skip=1750 ibs=1MB count=10 of=big_file.bin.part
Вы можете потратить некоторое время на чтение и понимание дд.
Вы можете использовать use tail, но указав смещение байта.
tail -c +$START_BYTE $file | head -c $LENGTH > newfile
Таким образом, tail может прыгать прямо в начальную точку (не считая новых линий), и как только голова соответствует правильной длине, она останавливается.
Вам просто нужно написать небольшую программу, чтобы найти какое-то случайное место и прочитать несколько строк.
Пример на Python (читает одну строку, но вы можете изменить ее):
def get_random_line():
"""Return a randomly selected line from a file."""
import random
fo = open("/some/file.txt")
try:
point = random.randrange(fo.size)
fo.seek(point)
c = fo.read(1)
while c != '\n' and fo.tell() > 0:
fo.seek(-2, 1)
c = fo.read(1)
line = fo.readline().strip()
finally:
fo.close()
return line