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.
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.
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.
$ 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
Utilisez grep
de sa manière la plus simple. Essayez grep --help
pour plus d'informations.
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
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
find .|xargs Perl -p -e 's/ /\n'|xargs grep aaa|wc -l
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.
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 '\[\[:<:\]\]'
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