Saya memiliki masalah dengan melihat potongan file teks yang sangat besar. File ini, sekitar 19 GB, jelas terlalu besar untuk dilihat dengan cara tradisional apa pun.
Saya telah mencoba head 1
dan tail 1
( head -n 1
dan tail -n 1
) dengan kedua perintah disalurkan bersama dalam berbagai cara (untuk mendapatkan bagian di tengah) tanpa hasil. Mesin Linux saya yang menjalankan Ubuntu 9.10 tidak dapat memproses file ini.
Bagaimana cara saya menangani file ini? Tujuan utama saya adalah mengasah jalur 45000000 dan 45000100.
split
membuat file besar lebih mudah untuk dikerjakan.dd
untuk mendapatkan bagian yang Anda cari. Misalnyadd if=bigfile of=extractfile bs=1M skip=10240 count=5
akan mengekstrak 5MB dari file mulai dari titik 10GB.Jawaban:
Anda harus menggunakan
sed
.Ini memberitahu Anda
sed
untuk mencetak baris 45000000-45000100 inklusif, dan untuk berhenti pada jalur 45000101.sumber
tail+|head
lebih cepat dengan 10-15% baik.Buat database MySQL dengan tabel tunggal yang memiliki bidang tunggal. Kemudian impor file Anda ke dalam basis data. Ini akan membuatnya sangat mudah untuk mencari garis tertentu.
Saya tidak berpikir hal lain bisa lebih cepat (jika
head
dantail
sudah gagal). Pada akhirnya, aplikasi yang ingin mencari barisn
harus mencari melalui seluruh file hingga ditemukann
baris baru. Tanpa semacam pencarian (indeks-baris ke byte diimbangi ke dalam file) tidak ada kinerja yang lebih baik dapat dicapai.Mengingat betapa mudahnya membuat database MySQL dan mengimpor data ke dalamnya, saya merasa ini adalah pendekatan yang layak.
Inilah cara melakukannya:
/tmp/my_large_file
akan menjadi file yang ingin Anda baca.Sintaks yang benar untuk mengimpor file dengan nilai batas-tab pada setiap baris, adalah:
Keuntungan utama lainnya adalah, jika nanti Anda memutuskan untuk mengekstrak rangkaian baris lain, Anda tidak perlu menunggu berjam-jam untuk pemrosesan lagi (kecuali jika Anda menghapus database tentu saja).
sumber
sed
perintah di bawah ini, dan mengidentifikasi baris saya. Tapi sekarang saya punya pertanyaan lanjutan bahwa metode basis data mungkin lebih cocok. Saya sekarang perlu menghapus beberapa ratus baris dari file.sed
bisa melakukan itu juga. Tentu saja, jika Anda memiliki data dalam database itu akan sepele untuk mengekspor file baru hanya dengan baris yang Anda inginkan.sed
jawabannya (karena itu memberi saya kesenangan lebih cepat; -) tetapi memberi Anda suara karena saya akan menggunakan metode Anda di masa depan. Saya menghargainya.FIELDS TERMINATED BY '\n'
keLOAD DATA
baris.Dua alat tua yang bagus untuk file besar adalah
join
dansplit
. Anda dapat menggunakan--lines=<number>
opsi split with yang memotong file ke beberapa file dengan ukuran tertentu.Sebagai contoh
split --lines=45000000 huge_file.txt
. Bagian yang dihasilkan akan berada di xa, xb, dll. Kemudian Anda dapathead
bagian xb yang akan mencakup baris yang Anda inginkan. Anda juga dapat 'bergabung' file kembali ke file besar tunggal.sumber
Anda memiliki alat yang tepat tetapi tidak menggunakannya dengan benar. Seperti yang sebelumnya dijawab di U&L,
tail -n +X file | head -n Y
(perhatikan+
) adalah 10-15% lebih cepat daripadased
untuk garis Y mulai dari X. Dan mudahnya, Anda tidak perlu secara eksplisitexit
prosesnya sepertised
.sumber