Bagaimana cara menghitung kemunculan sebuah kata di semua file direktori?

Saya mencoba menghitung kemunculan kata tertentu di seluruh direktori. Apakah ini mungkin?

Katakanlah misalnya ada direktori dengan 100 file yang semua filenya mungkin memiliki kata “aaa” di dalamnya. Bagaimana cara menghitung jumlah "aaa" di semua file di bawah direktori itu?

Saya mencoba sesuatu seperti:

 zegrep "xception" `find . -name '*auth*application*' | wc -l 

Tapi itu tidak berhasil.


person Ashish Sharma    schedule 26.05.2011    source sumber


Jawaban (7)


grep -roh aaa . | wc -w

Grep secara rekursif semua file dan direktori di direktori saat ini mencari aaa, dan hanya menampilkan yang cocok, bukan seluruh baris. Lalu, gunakan saja wc untuk menghitung berapa banyak kata yang ada.

person Carlos Campderrós    schedule 26.05.2011
comment
Juga jika Anda tidak ingin kecocokan sebenarnya, hanya hitungannya, Anda dapat menggunakan grep -rcP '^aaa$' . Itu menghemat perpipaan dan mencegah tertanamnya 'aaa' - person cgledezma; 30.07.2013
comment
@cgledezma poin bagus tentang -c, tetapi gagal jika ada dua atau lebih kemunculan SearchString dalam satu baris. - person Carlos Campderrós; 30.07.2013
comment
MM... Memang benar, saya tidak menyadarinya hanya menghitung jumlah baris yang cocok dan bukan jumlah kecocokan sebenarnya. Namun menurut saya mungkin berguna untuk menempatkan batas kata untuk menghindari kecocokan yang bersarang. Maaf, saya salah menempatkannya pada komentar sebelumnya: grep -rohP '\baaa\b . | wc -w - person cgledezma; 30.07.2013
comment
@cgledezma tentu, batasan kata mungkin berguna dalam beberapa situasi - person Carlos Campderrós; 30.07.2013
comment
Di osx @cgledezma, solusinya diterjemahkan menjadi grep -rohe '\baaa\b . | wc -w karena -P tidak tersedia. - person IanBussieres; 07.05.2015
comment
Satu hal yang perlu diperhatikan juga adalah jika Anda mencari pola yang memiliki spasi di antara beberapa kata atau huruf, misalnya grep -roh 'global \$' . atau grep -roh 'one two' . maka saat disalurkan ke wc -w semua kata akan dihitung. Jadi, Anda mungkin ingin hanya menghitung jumlah pencocokan persis, bukan total semua kata dalam hasil. Saya mencapai ini dengan memasukkan ke grep lagi tetapi hanya mencari kata pertama misalnya grep -roh 'global \$' . | grep -o 'global' | wc -w . Namun mungkinkah ada cara yang lebih elegan? - person mrjamesmyers; 06.03.2018

Solusi lain berdasarkan find dan grep.

find . -type f -exec grep -o aaa {} \; | wc -l

Harus menangani nama file dengan spasi di dalamnya dengan benar.

person Fredrik Pihl    schedule 28.05.2011
comment
sempurna! Saya menggunakan find berdasarkan ukuran, ini berfungsi dengan baik - person SeanDowney; 29.09.2011
comment
@Fredrik: ini dijalankan dengan sempurna tetapi apakah ada cara untuk menghitung kata dengan menghindari penghitungan ganda untuk kata tersebut dalam file yang sama? Misalnya: jika kata aaa muncul di file1.txt sebanyak 10 kali, tetapi jumlah seharusnya bertambah hanya 1 tetapi tidak 10 & demikian pula di file lain juga dalam direktori. - person annunarcist; 09.11.2013
comment
@annunarcist -- ya itu bisa dilakukan. Kirimkan pertanyaan baru dan saya akan melihatnya :-) - person Fredrik Pihl; 09.11.2013
comment
@Fredrik: diposting! Berikut adalah tautan - person annunarcist; 09.11.2013

Gunakan grep dengan cara yang paling sederhana. Coba grep --help untuk info lebih lanjut.


  1. Untuk mengetahui jumlah kata dalam file tertentu:

    grep -c <word> <file_name>
    

    Contoh:

    grep -c 'aaa' abc_report.csv
    

    Keluaran:

    445
    

  1. Untuk menghitung jumlah kata di seluruh direktori:

    grep -c -R <word>
    

    Contoh:

    grep -c -R 'aaa'
    

    Keluaran:

    abc_report.csv:445
    lmn_report.csv:129
    pqr_report.csv:445
    my_folder/xyz_report.csv:408
    
person Parag Tyagi    schedule 13.03.2016

Ayo gunakan AWK!

$ function wordfrequency() { awk 'BEGIN { FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) { word = tolower($i); words[word]++ } } END { for (w in words) printf("%3d %s\n", words[w], w) } ' | sort -rn; }
$ cat your_file.txt | wordfrequency

Ini mencantumkan frekuensi kemunculan setiap kata dalam file yang disediakan. Jika Anda ingin melihat kemunculan kata Anda, Anda dapat melakukan ini:

$ cat your_file.txt | wordfrequency | grep yourword

Untuk menemukan kemunculan kata Anda di seluruh file dalam direktori (secara non-rekursif), Anda dapat melakukan ini:

$ cat * | wordfrequency | grep yourword

Untuk menemukan kemunculan kata Anda di seluruh file dalam direktori (dan subdirektorinya), Anda dapat melakukan ini:

$ find . -type f | xargs cat | wordfrequency | grep yourword

Sumber: Ruby AWK-ward

person Sheharyar    schedule 15.12.2014

cat file-file tersebut bersama-sama dan ambil hasilnya: cat $(find /usr/share/doc/ -name '*.txt') | zegrep -ic '\<exception\>'

jika Anda ingin 'luar biasa' cocok, jangan gunakan '\‹' dan '\>' di sekitar kata tersebut.

person jcomeau_ictx    schedule 26.05.2011

Bagaimana kalau memulai dengan:

cat * | sed 's/ /\n/g' | grep '^aaa$' | wc -l

seperti pada transkrip berikut:

pax$ cat file1
this is a file number 1

pax$ cat file2
And this file is file number 2,
a slightly larger file

pax$ cat file[12] | sed 's/ /\n/g' | grep 'file$' | wc -l
4

sed mengonversi spasi menjadi baris baru (Anda mungkin ingin menyertakan karakter spasi lainnya seperti tab, dengan sed 's/[ \t]/\n/g'). grep hanya mendapatkan baris-baris yang memiliki kata yang diinginkan, lalu wc menghitung baris-baris itu untuk Anda.

Sekarang mungkin ada kasus-kasus ekstrem di mana skrip ini tidak berfungsi tetapi skrip ini seharusnya baik-baik saja untuk sebagian besar situasi.

Jika Anda menginginkan seluruh pohon (bukan hanya satu tingkat direktori), Anda dapat menggunakan sesuatu seperti:

( find . -name '*.txt' -exec cat {} ';' ) | sed 's/ /\n/g' | grep '^aaa$' | wc -l
person paxdiablo    schedule 26.05.2011

Ada juga sintaks regex grep untuk kata-kata yang cocok saja:

# based on Carlos Campderrós solution posted in this thread
man grep | less -p '\<'
grep -roh '\<aaa\>' . | wc -l

Untuk sintaks regex pencocokan kata yang berbeda, lihat:

man re_format | less -p '\[\[:<:\]\]'
person tim    schedule 28.05.2011