2

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

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

3 ответа3

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

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

4

Вы можете использовать use tail, но указав смещение байта.

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

Таким образом, tail может прыгнуть прямо в начальную точку (без подсчета новых линий), и как только голова соответствует правильной длине, он останавливается.

1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .