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

1650
WilliamKF

У меня огромный лог-файл размером около 3,5 ГБ, и я хотел бы отобрать случайные разделы в середине, скажем, 10 МБ для отладки того, что делает мое приложение.

Я мог бы использовать команды head или tail, чтобы получить начало или конец файла, как я могу получить произвольную часть от середины файла? Я думаю, я мог бы сделать что-то подобное, head -n 1.75GB | tail -n 10MBно это кажется неуклюжим, и мне нужно было бы определить номера строк для средней точки файла, чтобы получить количество строк 1,75 ГБ и 10 МБ.

2

3 ответа на вопрос

6
kmkkmk
$ dd if=big_file.bin skip=1750 ibs=1MB count=10 of=big_file.bin.part 

Вы можете потратить некоторое время на чтение и понимание дд.

Поскольку `dd` не знает строк, вы можете захотеть обрезать первую и последнюю строки, чтобы были включены только полные строки, например:` dd ... | голова -n-1 | tail -n + 2` или с `sed`:` dd ... | sed '1d; $ D' `. Thor 11 лет назад 0
4
user1278519

You can use use tail, but by specify a byte offset.

tail -c +$START_BYTE $file | head -c $LENGTH > newfile

That way tail can jump directly to the starting point (without counting new lines) and once head matches the correct length, it stops running.

Хороший. Это работает с произвольными смещениями и размерами байтов, которые `dd` не может сделать. Mike 9 лет назад 0
@ Майк, разве нет? (GNU) `dd` имеет опции` _bytes`. Или вы можете просто сделать `dd bs = 1`, но это может быть не очень эффективно. Karel Vlk 6 лет назад 0
1
Keith

Вам просто нужно написать небольшую программу, чтобы найти какое-то случайное место и прочитать некоторое количество строк.

Пример на 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 

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