Como pegar uma seção aleatória no meio de um arquivo enorme?

2

Eu tenho um enorme arquivo de log de cerca de 3,5 GB e gostaria de amostrar seções aleatórias no meio de, digamos, 10 MB com o propósito de depurar o que meu aplicativo está fazendo.

Eu poderia usar os comandos head ou tail para obter o começo ou fim do arquivo, como eu posso pegar uma parte arbitrária do meio do arquivo? Eu acho que eu poderia fazer algo como head -n 1.75GB | tail -n 10MB , mas isso parece desajeitado e eu preciso determinar os números de linha para o ponto médio do arquivo para obter contagens de linha de 1.75GB e 10MB.

    
por WilliamKF 23.04.2011 / 19:57

3 respostas

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

Você pode querer passar algum tempo lendo e entendendo o dd.

    
por 24.04.2011 / 01:43
4

Você pode usar tail, mas especificar um byte offset.

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

Dessa forma, a cauda pode pular diretamente para o ponto de partida (sem contar novas linhas) e, assim que a cabeça coincide com o comprimento correto, ela pára de funcionar.

    
por 22.02.2013 / 09:48
1

Você só precisa escrever um pequeno programa para procurar algum local aleatório e ler algumas linhas.

Um exemplo em Python (lê uma linha, mas você pode modificá-la):

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
    
por 23.04.2011 / 20:33