web-dev-qa-db-fra.com

Comment compter les occurrences d'un Word dans tous les fichiers d'un répertoire?

J'essaie de compter une occurrence de Word particulière dans tout un répertoire. Est-ce possible?

Supposons par exemple qu'il existe un répertoire contenant 100 fichiers dont tous les fichiers peuvent contenir le mot "aaa". Comment pourrais-je compter le nombre de "aaa" dans tous les fichiers de ce répertoire?

J'ai essayé quelque chose comme:

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

Mais ça ne marche pas.

49
Ashish Sharma

grep -roh aaa . | wc -w

Grep récursivement tous les fichiers et répertoires dans le répertoire courant à la recherche de aaa, et n'affiche que les correspondances, pas la ligne entière. Ensuite, utilisez simplement wc pour compter le nombre de mots.

89

Une autre solution basée sur find et grep.

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

Doit gérer correctement les noms de fichiers contenant des espaces.

7
Fredrik Pihl

Utilisons 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

Ceci répertorie la fréquence de chaque mot apparaissant dans le fichier fourni. Si vous voulez voir les occurrences de votre mot, vous pouvez simplement faire ceci:

$ cat your_file.txt | wordfrequency | grep yourword

Pour rechercher les occurrences de votre Word dans tous les fichiers d'un répertoire (de manière non récursive), vous pouvez le faire:

$ cat * | wordfrequency | grep yourword

Pour trouver les occurrences de votre Word dans tous les fichiers d'un répertoire (et de ses sous-répertoires), vous pouvez le faire:

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

Source: AWK-ward Ruby

3
Sheharyar

Utilisez grep de sa manière la plus simple. Essayez grep --help pour plus d'informations.


  1. Pour obtenir le nombre d'un mot dans un fichier particulier:

    grep -c <Word> <file_name>
    

    Exemple:

    grep -c 'aaa' abc_report.csv
    

    Sortie:

    445
    

  1. Pour obtenir le compte d'un mot dans le répertoire entier:

    grep -c -R <Word>
    

    Exemple:

    grep -c -R 'aaa'
    

    Sortie:

    abc_report.csv:445
    lmn_report.csv:129
    pqr_report.csv:445
    my_folder/xyz_report.csv:408
    
2
find .|xargs Perl -p -e 's/ /\n'|xargs grep aaa|wc -l
1
Vijay

cat les fichiers ensemble et grep la sortie: cat $(find /usr/share/doc/ -name '*.txt') | zegrep -ic '\<exception\>'

si vous voulez que "exceptionnel" corresponde, n'utilisez pas les "\ <" et "\>" autour de Word.

0
jcomeau_ictx

Il existe également une syntaxe regex grep pour faire correspondre les mots uniquement:

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

Pour une syntaxe regex de correspondance Word différente, voir:

man re_format | less -p '\[\[:<:\]\]'
0
tim

Que diriez-vous de commencer par:

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

comme dans la transcription suivante:

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 convertit les espaces en sauts de ligne (vous souhaiterez peut-être inclure autres caractères d'espacement ainsi que les tabulations, avec sed 's/[ \t]/\n/g'). Le grep obtient juste les lignes qui ont le mot souhaité, puis le wc compte ces lignes pour vous.

Il peut maintenant y avoir des cas Edge où ce script ne fonctionne pas, mais cela devrait convenir à la grande majorité des situations.

Si vous vouliez un ensemble arbre (pas seulement un seul niveau de répertoire), vous pouvez utiliser quelque chose comme:

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