J'ai un fichier JSON volumineux sur une ligne et je souhaite utiliser la ligne de commande pour pouvoir compter le nombre d'occurrences d'un mot dans le fichier. Comment puis je faire ça?
bash
command-line
grep
json
mythz
la source
la source
{ "key": "the key" }
doit compter la chaînekey
une ou deux fois.Réponses:
Où
tr
remplace les espaces par des nouvelles lignes,grep
filtre toutes les lignes résultantes correspondant à WORD etwc
compte les lignes restantes.On peut même sauvegarder la
wc
pièce en utilisant l'-c
option de grep:L'
-c
option est définie par POSIX.S'il n'est pas garanti qu'il y ait des espaces entre les mots, vous devez utiliser un autre caractère (comme délimiteur) à remplacer. Par exemple, des
tr
pièces alternatives sontou
si vous souhaitez remplacer les guillemets simples ou doubles. Bien sûr, vous pouvez également utiliser
tr
pour remplacer plusieurs caractères à la fois (pensez à différents types d'espaces et de ponctuation).Si vous devez compter WORD mais pas prefixWORD, WORDsuffix ou prefixWORDsuffix, vous pouvez inclure le modèle WORD dans des marqueurs de début / fin de ligne:
Ce qui équivaut à des marqueurs de début / fin de mot, dans notre contexte:
la source
tr
commande qui fait le travail au lieu de suggérer des exemples qui ne fonctionneront jamais dans toutes les situations. Cela fera aussi correspondre les mots qui contiennent le mot que vous recherchez. Lagrep -o '\<WORD\>' | wc -l
solution est de loin supérieure.Avec GNU grep, cela fonctionne:
grep -o '\<WORD\>' | wc -l
-o
imprime chaque partie correspondante de chaque ligne sur une ligne distincte.\<
affirme le début d'un mot et\>
la fin d'un mot (similaire à celui de Perl\b
), ce qui garantit que vous ne faites pas correspondre une chaîne au milieu d'un mot.Par exemple,
la source
grep -wo WORD | wc -l
Cela ne fonctionne malheureusement pas avec GNU
coreutils
.Si cela fonctionne sur votre plate-forme, c'est une solution élégante et assez intuitive; mais les gens de GNU réfléchissent encore.
la source
grep
a un bug ici. POSIX n’indique pas clairement ce-c
que-o
devrait être la sémantique de la combinaison , ce qui n’est pour le moment pas portable. Merci pour le commentaire; J'ai mis à jour cette réponse.Cette commande a les effets suivants:
Par exemple, si je veux analyser le premier message de Linus Torvald:
Je crée un fichier nommé linus.txt , je colle le contenu puis j'écris dans la console:
Le résultat serait:
Si vous voulez visualiser uniquement les 20 premiers mots:
Est important de noter que la commande tr « AZ » « a-z » ne suport UTF-8 encore , de sorte que dans les langues étrangères seraient traduites mot comme après APRÈS.
Si vous voulez seulement rechercher l'occurrence d'un mot, vous pouvez ajouter un grep à la fin:
Dans un script appelé search_freq :
Le script doit s'appeler:
la source
sed: -e expression #2, char 7: unterminated
s 'commande`, cela compte aussi tous les mots, non? Mais OP a demandé seulement un particulier. Aussi un peu d'explication serait bien.Selon que vous souhaitez faire correspondre le mot dans les clés ou dans les valeurs des données JSON, vous souhaiterez probablement extraire uniquement les clés ou les valeurs des données. Sinon, vous risquez de compter trop de mots si ils apparaissent à la fois comme clés et comme valeurs.
Pour extraire toutes les clés:
Ceci teste de manière récursive si la chose actuelle est un objet et si c'est le cas, il extrait les clés. La sortie sera une liste de clés, une par ligne.
Pour extraire toutes les valeurs:
Cela fonctionne de la même manière, mais en moins d’étapes.
Vous pouvez ensuite diriger la sortie de ce qui précède
grep -c 'PATTERN'
(pour faire correspondre certains motifs aux clés ou aux valeurs), ougrep -c -w -F 'WORD'
(pour faire correspondre un mot aux clés ou aux valeurs), ougrep -c -x -F 'WORD'
(pour faire correspondre une clé ou une valeur complète), ou similaire, à faites votre compte.la source
J'ai json avec quelque chose comme ça:
"number":"OK","number":OK"
répété plusieurs fois dans une ligne.Mon simple compteur "OK":
sed "s|,|\n|g" response | grep -c OK
la source
J'ai utilisé la commande ci-dessous awk pour trouver le nombre d'occurrences
exemple de fichier
cat file1
commander:
sortie
la source
awk '{sum+=gsub("praveen","")} END {print sum+0}'
.