Saya memiliki file besar yang berisi satu string di setiap baris. Saya ingin dapat dengan cepat menentukan apakah string ada di file. Idealnya, ini akan dilakukan dengan menggunakan algoritma tipe biner chop.
Beberapa Googling mengungkapkan look
perintah dengan -b
flag yang menjanjikan untuk menemukan dan mengeluarkan semua string yang diawali dengan awalan yang diberikan menggunakan algoritma pencarian biner. Sayangnya, tampaknya tidak berfungsi dengan benar dan mengembalikan hasil nol untuk string yang saya tahu ada di file (mereka dikembalikan dengan benar oleh grep
pencarian yang setara ).
Adakah yang tahu utilitas atau strategi lain untuk mencari file ini secara efisien?
look
perintah berfungsi dengan benar, karena tampilan tampaknya mengabaikan lokal dan hanya menggunakan C seperti menyortir hardcoded, saya juga membuka bug karena perilaku membingungkan ini: bugzilla.kernel.org/show_bug.cgi?id=198011look -b
gagal untuk saya dengan kesalahanFile too large
. Saya pikir itu mencoba membaca semuanya ke dalam memori.Jawaban:
Ada perbedaan mendasar antara
grep
danlook
:Kecuali dinyatakan sebaliknya,
grep
akan menemukan pola bahkan di suatu tempat di dalam garis. Untuklook
status halaman manual:Saya tidak menggunakan
look
terlalu sering, tetapi itu berfungsi dengan baik pada contoh sepele yang baru saja saya coba.sumber
egrep "^TEST" sortedlist.txt | wc -l
saya mendapatkan 41.289 hasil. Namunlook
perintah yang setara ,look -b TEST sortedlist.txt | wc -l
hanya menghasilkan 1995 hasil. Saya hampir bertanya-tanya apakah ada bug dilook
.look
menggunakan pengaturan pemeriksaan yang berbeda dari program yang Anda gunakan untuk mengurutkan file.Mungkin sedikit terlambat menjawab:
Sgrep akan membantu Anda.
Sgrep (sort grep) mencari file input yang diurutkan untuk baris yang cocok dengan kunci pencarian dan menampilkan baris yang cocok. Saat mencari file besar sgrep jauh lebih cepat daripada grep Unix tradisional, tetapi dengan batasan yang signifikan.
Anda dapat mengunduh sumber di sini: https://sourceforge.net/projects/sgrep/?source=typ_redirect
dan dokumen-dokumen di sini: http://sgrep.sourceforge.net/
Cara lain:
Saya tidak tahu seberapa besar file tersebut. Mungkin Anda harus mencoba paralel:
/programming/9066609/fastest-possible-grep
Saya selalu melakukan grep dengan file yang ukuran> 100GB, itu berfungsi dengan baik.
sumber
sudo apt-get install sgrep
untuk mendapatkan sgrep, sgrep di repositori buntu sebenarnya bukan sgrep ini, saya tidak yakin itu hal yang sama.Anda dapat memotong file menjadi beberapa bagian dan kemudian hanya mengambil bagian yang Anda inginkan:
maka pencarian akan terlihat seperti:
Ini melakukan dua hal:
sumber
sgrep mungkin bekerja untuk Anda:
Halaman proyek http://sgrep.sourceforge.net/ mengatakan:
Namun untuk penyisipan, saya pikir tidak ada solusi yang lebih baik daripada menggunakan database: /programming/10658380/shell-one-liner-to-add-a-line-to-a-sorted-file/ 33859372 # 33859372
sumber
sgrep
dalam repositori Ubuntu sebenarnya sgrep ini , yang dirancang untuk "mencari file untuk pola terstruktur" dan tidak ada hubungannya dengan pencarian biner.Jika Anda menginginkannya sangat cepat (O (1) cepat), Anda dapat membuat hash set untuk melihatnya. Saya tidak dapat menemukan implementasi yang akan membiarkan saya menyimpan hash yang sudah dibangun dalam sebuah file dan menyelidikinya tanpa harus membaca seluruh file ke dalam memori, jadi saya menggulung sendiri .
Bangun hash set (
-b
/--build
):Periksa set hash (
-p
/--probe
):... atau dengan string untuk mencari input standar:
Anda dapat meredam output
--probe
dengan opsi-q
/--quiet
jika Anda hanya tertarik pada status keluar:Untuk opsi lebih lanjut lihat deskripsi penggunaan yang dapat diakses melalui
-h
/--help
opsi atauREADME
file yang menyertainya .sumber