Katakanlah, saya memiliki file teks yang sangat besar (sekitar 10.000.000 baris). Saya perlu grep
dari awal dan menyimpan hasilnya ke file. Apa cara paling efisien untuk menyelesaikan tugas?
command-line
sed
awk
grep
efficiency
kekacauan
sumber
sumber
tac
dangrep
untuk mencapai apa yang Anda inginkan.grep
memiliki--max-count (number)
saklar yang batal setelah sejumlah pertandingan, yang mungkin menarik bagi Anda.Jawaban:
Solusi tac / grep
Atau sedikit lebih efektif:
Waktu dengan file 500MB:
Solusi sed / grep :
Waktu dengan file 500MB: Dibatalkan setelah 10+ menit.
Solusi awk / grep :
Waktu dengan file 500MB:
Solusi perl / grep :
Waktu dengan file 500MB:
sumber
sed
,awk
danperl
(dengan metode ini) tidak OK karena mereka membaca file dari awal, yang sangat tidak efisien. Saya kira itutac
melakukan hal yang benar.< <(tac filename)
Harus secepat pipa: dalam kedua kasus, perintah dijalankan secara paralel.tac
setelah grep. Jika Anda memiliki 10.000.000 file baris, dengan hanya 2 yang cocok, Andatac
hanya perlu membalikkan 2 baris, bukan 10m.grep
masih akan harus melalui semuanya.tac
setelahgrep
, itu akan membaca dari pipa dan tidak bisa mencari. Itu akan membuatnya kurang efisien (atau gagal sepenuhnya) jika jumlah garis yang ditemukan besar.Solusi ini mungkin membantu:
sumber
tac
adalah perintah GNU. Pada kebanyakan sistem lain, padanannya adalahtail -r
.tail -r
terbatas pada sejumlah kecil garis, ini mungkin menjadi masalah.tail -r /etc/passwd
gagal dengantail: invalid option -- 'r'
. Saya menggunakan coreutils-8.21-21.fc20.x86_64.tac
(dan hanya GNU yang memiliki tac) yang dimiliki banyak Unix lainnyatail -r
. GNUtail
tidak mendukung-r
Yang ini keluar segera setelah menemukan kecocokan pertama:
Berikut ini memberikan 5 baris sebelum dan setelah dua pertandingan pertama:
Ingatlah untuk tidak menggunakan
-i
(case sensitive) kecuali Anda harus karena itu akan memperlambat grep.Jika Anda tahu string yang tepat yang Anda cari, pertimbangkan
fgrep
(Fixed String)sumber
Jika file tersebut sangat besar, tidak dapat disimpan dalam memori, saya akan menggunakan
Perl
dengan File :: ReadBackwards modul dariCPAN
:Kemudian:
sumber
tac
.