Büyük bir dosyanın ortasında rastgele bir bölüm kapmak nasıl?


3

3.5 GB civarında büyük bir günlük dosyasına sahibim ve uygulamamın yaptığı şeyi hata ayıklamak amacıyla 10 MB gibi rasgele bölümler denemek istiyorum.

Dosyanın başlangıcını veya sonunu almak için head veya tail komutlarını kullanabilirim, dosyanın ortasından rastgele bir kısmını nasıl alabilirim? Sanırım böyle bir şey yapabilirdim head -n 1.75GB | tail -n 10MBama sakar görünüyor ve dosyanın orta noktası için satır numaralarını 1.75GB ve 10MB satır sayısını almak için belirlemeliyim.

Yanıtlar:


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

Gd'yi okumak ve anlamak için biraz zaman harcamak isteyebilirsiniz.


As dd: hatlarının farkında değildir, sadece komple hatları, örneğin içerdiği şekilde, ilk ve sonuncusu arasında kırpmak isteyebilirsiniz dd ... | head -n-1 | tail -n+2ya da sed: dd ... | sed '1d; $d'.
Thor,

4

Kullanım kuyruk kullanabilirsiniz, ancak bir bayt ofset belirtin.

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

Bu şekilde kuyruk doğrudan başlangıç ​​noktasına (yeni satırları saymadan) atlayabilir ve kafa doğru uzunluğa ulaştıktan sonra çalışmayı durdurur.


Güzel. Bu, ddyapamayan keyfi bayt ofsetleri ve boyutlarıyla çalışır .
Mike

@Mike Yapamaz mı? (GNU) ddsahiptir {count,skip,seek}_bytesseçenekleri. Ya da sadece yapabilirdiniz dd bs=1ama bu çok verimli olmayabilir.
Karel Vlk

1

Sadece rastgele noktalara ulaşmak için biraz program yazmanız ve bazı satırları okumanız yeterli.

Python'daki bir örnek (bir satır okur, ancak onu değiştirebilirsiniz):

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.