Saya yakin seseorang memiliki kebutuhan di bawah ini, apa cara cepat untuk memecah file .gz besar demi baris? File teks yang mendasarinya memiliki 120 juta baris. Saya tidak punya cukup ruang disk untuk mem-gunzip seluruh file sekaligus jadi saya bertanya-tanya apakah ada yang tahu tentang skrip bash / perl atau alat yang dapat membagi file (baik .gz atau inner .txt) menjadi file baris 3x 40mn . yaitu menyebutnya seperti:
bash splitter.sh hugefile.txt.gz 4000000 1
would get lines 1 to 40 mn
bash splitter.sh hugefile.txt.gz 4000000 2
would get lines 40mn to 80 mn
bash splitter.sh hugefile.txt.gz 4000000 3
would get lines 80mn to 120 mn
Mungkin melakukan serangkaian solusi ini atau apakah gunzip -c membutuhkan ruang yang cukup untuk seluruh file untuk di-unzip (yaitu masalah asli): gunzip -c hugefile.txt.gz | kepala 4000000
Catatan: Saya tidak bisa mendapatkan disk tambahan.
Terima kasih!
Jawaban:
Cara melakukan ini terbaik tergantung pada apa yang Anda inginkan:
Jika Anda ingin satu bagian file , ide Anda digunakan
gunzip
danhead
benar. Kamu bisa memakai:Itu akan menampilkan 4000000 baris pertama pada out standar - Anda mungkin ingin menambahkan pipa lain untuk benar-benar melakukan sesuatu dengan data.
Untuk mendapatkan bagian lain, Anda akan menggunakan kombinasi
head
dantail
, seperti:untuk mendapatkan blok kedua.
Tidak,
gunzip -c
tidak memerlukan ruang disk apa pun - ia melakukan segalanya dalam memori, lalu mengalirkannya ke stdout.Jika Anda ingin membuat semua bagian dalam sekali jalan , lebih efisien untuk membuat semuanya dengan satu perintah, karena file input hanya dibaca sekali. Salah satu solusi yang baik adalah menggunakan
split
; lihat jawaban jim mcnamara untuk lebih jelasnya.sumber
gzip
tidak tahu tentang batas (yang berasal dari proses yang berbeda). Jikahead
digunakan,head
akan keluar ketika sudah cukup menerima, dan ini akan menyebar kegzip
(melalui SIGPIPE, lihat Wikipedia). Karenatail
ini tidak mungkin, jadi ya,gzip
akan mendekompresi semuanya.pipa untuk dibagi menggunakan gunzip -c atau zcat untuk membuka file
Tambahkan spesifikasi output ke perintah split.
sumber
Saat Anda mengerjakan aliran (tidak dapat mundur), Anda ingin menggunakan bentuk '+ N' ekor untuk mendapatkan garis mulai dari garis N dan seterusnya.
sumber
Saya akan mempertimbangkan menggunakan split .
sumber
Pisahkan file .gz menjadi file .gz:
Saya pikir ini yang diinginkan OP, karena dia tidak punya banyak ruang.
sumber
Berikut ini adalah skrip python untuk membuka kumpulan file globbed dari direktori, gunzip jika perlu, dan bacalah secara baris demi baris. Ini hanya menggunakan ruang yang diperlukan dalam memori untuk memegang nama file, dan baris saat ini, ditambah sedikit overhead.
Perintah baris cetak akan mengirim setiap baris ke std, sehingga Anda dapat mengarahkan ulang ke file. Atau, jika Anda memberi tahu kami apa yang ingin Anda lakukan dengan baris, saya dapat menambahkannya ke skrip python dan Anda tidak perlu meninggalkan potongan file yang tergeletak di sekitar.
sumber
Berikut adalah program perl yang dapat digunakan untuk membaca stdin, dan membagi baris, memipakan setiap rumpun ke perintah terpisah yang dapat menggunakan variabel shell $ SPLIT untuk merutekannya ke tujuan yang berbeda. Untuk kasus Anda, itu akan diminta
zcat hugefile.txt.gz | perl xsplit.pl 40000000 'cat > tmp$SPLIT.txt; do_something tmp$SPLIT.txt; rm tmp$SPLIT.txt'
Maaf pemrosesan command-line agak kotor tetapi Anda mendapatkan ide.
sumber