Gunzip / Estrai file “parte da parte”
-
03-10-2019 - |
Domanda
Sono su un server condiviso con lo spazio su disco limitato e ho un file di gz che si espande in un file di super enorme, più di quello che ho. Come posso estrarre "porzione" di "parte (diciamo 10 MB alla volta), ed elaborare ogni porzione, senza estrarre il tutto anche solo temporaneamente!
No, questo è solo un eccellente enorme file compresso, non un insieme di file per favore ...
Ciao David, il tuo aspetto soluzione piuttosto elegante, ma se sto preparando bene, sembra che ogni volta estratti gunzip dall'inizio del file (e l'uscita che viene gettato via). Sono sicuro che sarà causa di uno sforzo enorme sul server condiviso io sono sulla (non penso proprio "lettura avanti" a tutti) - hai qualche intuizioni su come posso fare gunzip "saltare" il numero necessario dei blocchi?
Soluzione
Se stai facendo questo con (Unix / Linux) strumenti di shell, è possibile utilizzare gunzip -c
per decomprimere sullo standard output, quindi utilizzare dd
con le opzioni skip
e count
di copiare un solo pezzo.
Ad esempio:
gunzip -c input.gz | dd bs=10485760 skip=0 count=1 >output
quindi saltare = 1, saltare = 2, ecc.
Altri suggerimenti
Purtroppo non so di un comando esistente Unix che fa esattamente quello che ti serve. Si potrebbe fare facilmente con un piccolo programma in qualsiasi lingua, per esempio in Python, cutter.py
(qualsiasi lingua farebbe altrettanto bene, ovviamente):
import sys
try:
size = int(sys.argv[1])
N = int(sys.argv[2])
except (IndexError, ValueError):
print>>sys.stderr, "Use: %s size N" % sys.argv[0]
sys.exit(2)
sys.stdin.seek((N-1) * size)
sys.stdout.write(sys.stdin.read(size))
Ora gunzip <huge.gz | python cutter.py 1000000 5 > fifthone
metterà in file di fifthone
esattamente un milione di byte, saltando i primi 4 milioni di byte nel flusso non compresso.