私は約3.5GBの巨大なログファイルを持っており、アプリケーションの実行内容をデバッグするために、たとえば10MBの途中でランダムなセクションをサンプリングしたいと思います。
ヘッドコマンドまたはテールコマンドを使用してファイルの先頭または末尾を取得できますが、ファイルの中央から任意の部分を取得するにはどうすればよいですか? head -n 1.75GB | tail -n 10MB
のようなことができると思いますが、それは不器用なようで、1.75GBと10MBの行数を取得するには、ファイルの中点の行番号を決定する必要があります。
$ dd if=big_file.bin skip=1750 ibs=1MB count=10 of=big_file.bin.part
Ddを読んで理解するのに少し時間をかけたいと思うかもしれません。
Use tailを使用できますが、バイトオフセットを指定します。
tail -c +$START_BYTE $file | head -c $LENGTH > newfile
そうすれば、テールは(新しいラインを数えずに)開始点に直接ジャンプでき、ヘッドが正しい長さに一致すると、実行を停止します。
ランダムな場所を探して、ある程度の行を読み取るための小さなプログラムを作成する必要があります。
Python(1行を読み取りますが、変更できます)の例:
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