grep -c
berguna untuk menemukan berapa kali string muncul dalam file, tetapi hanya menghitung setiap kemunculannya sekali per baris. Bagaimana cara menghitung beberapa kejadian per baris?
Saya mencari sesuatu yang lebih elegan daripada:
perl -e '$_ = <>; print scalar ( () = m/needle/g ), "\n"'
grep
ditentukan, tetapi bagi siapa pun yang menggunakanack
, jawabannya sederhanaack -ch <pattern>
.Jawaban:
grep's
-o
hanya akan menampilkan pertandingan, mengabaikan garis;wc
dapat menghitungnya:Ini juga akan cocok dengan 'jarum' atau 'multineedle'.
Hanya satu kata:
sumber
\b
dan\B
dilakukan di sini?uniq
hanya menghapus garis identik yang berdekatan, Anda perlusort
sebelum memberi makan keuniq
jika Anda belum yakin bahwa duplikat akan selalu berbatasan langsung.Jika Anda memiliki GNU grep (selalu di Linux dan Cygwin, kadang-kadang di tempat lain), Anda dapat menghitung baris output dari
grep -o
:grep -o needle | wc -l
.Dengan Perl, berikut adalah beberapa cara yang saya anggap lebih elegan dari milik Anda (bahkan setelah diperbaiki ).
Dengan hanya alat POSIX, satu pendekatan, jika mungkin, adalah membagi input menjadi garis dengan satu kecocokan sebelum meneruskannya ke grep. Misalnya, jika Anda mencari seluruh kata, maka pertama-tama ubah setiap karakter non-kata menjadi baris baru.
Kalau tidak, tidak ada perintah standar untuk melakukan sedikit pemrosesan teks ini, jadi Anda perlu beralih ke sed (jika Anda seorang masokis) atau awk.
Berikut adalah solusi yang lebih sederhana menggunakan
sed
dangrep
, yang berfungsi untuk string atau bahkan oleh-the-book ekspresi reguler tetapi gagal dalam beberapa kasus sudut dengan pola berlabuh (misalnya menemukan dua kemunculan^needle
atau\bneedle
dalamneedleneedle
).Perhatikan bahwa dalam substitusi sed di atas, yang saya
\n
maksud adalah baris baru. Ini adalah standar di bagian pola, tetapi dalam teks pengganti, untuk portabilitas, gantikan backslash-newline untuk\n
.sumber
Jika, seperti saya, Anda benar-benar ingin
"keduanya; masing-masing tepat sekali",(ini sebenarnya "baik; dua kali") maka itu sederhana:dan periksa hasilnya
2
.Manfaat dari pendekatan ini (jika tepat sekali adalah apa yang Anda inginkan) adalah mudah untuk diukur.
sumber
Solusi lain menggunakan awk dan
needle
sebagai pemisah bidang:Jika Anda ingin mencocokkan
needle
diikuti oleh tanda baca, ubah pemisah bidang yang sesuai yaituAtau gunakan kelas:
[^[:alnum:]]
untuk mencakup semua karakter non alpha.sumber
Contoh Anda hanya mencetak jumlah kemunculan per-baris, dan bukan total dalam file. Jika itu yang Anda inginkan, sesuatu seperti ini mungkin berhasil:
sumber
Ini adalah solusi bash murni saya
sumber