Ich habe eine große JSON-Datei, die sich in einer Zeile befindet, und ich möchte die Befehlszeile verwenden, um die Anzahl der Vorkommen eines Wortes in der Datei zu zählen. Wie kann ich das machen?
bash
command-line
grep
json
Mythos
quelle
quelle
{ "key": "the key" }
die Zeichenfolgekey
ein- oder zweimal gezählt werden soll.Antworten:
Wenn
tr
Leerzeichen durch Zeilenumbrüche ersetzt werden, werdengrep
alle resultierenden Zeilen, die mit WORD übereinstimmen, gefiltert undwc
die verbleibenden Zeilen gezählt .Man kann das
wc
Teil sogar mit der-c
Option grep speichern :Die
-c
Option wird von POSIX definiert.Wenn nicht garantiert wird, dass zwischen den Wörtern Leerzeichen stehen, müssen Sie ein anderes Zeichen (als Trennzeichen) verwenden, um diese zu ersetzen. Zum Beispiel sind alternative
tr
Teileoder
Wenn Sie doppelte oder einfache Anführungszeichen ersetzen möchten. Natürlich können Sie auch
tr
mehrere Zeichen gleichzeitig ersetzen (verschiedene Arten von Leerzeichen und Interpunktionszeichen).Falls Sie WORD, aber nicht prefixWORD, WORDsuffix oder prefixWORDsuffix zählen müssen, können Sie das WORD-Muster in Zeilenanfangs- / Zeilenende-Markierungen einschließen:
Was in unserem Kontext den Wortanfangs- / -ende-Markierungen entspricht:
quelle
tr
Befehl erstellen, der die Aufgabe erfüllt, anstatt Beispiele vorzuschlagen, die niemals in allen Situationen funktionieren. Es werden auch Wörter gefunden, die das gesuchte Wort enthalten. Diegrep -o '\<WORD\>' | wc -l
Lösung ist weit überlegen.Mit GNU grep funktioniert Folgendes:
grep -o '\<WORD\>' | wc -l
-o
druckt alle übereinstimmenden Teile jeder Zeile in eine separate Zeile.\<
Setzt den Anfang eines Wortes und\>
das Ende eines Wortes (ähnlich wie bei Perl\b
). Dadurch wird sichergestellt, dass Sie keine Zeichenfolge in der Mitte eines Wortes finden.Zum Beispiel,
quelle
grep -wo WORD | wc -l
Dies funktioniert leider nicht mit GNU
coreutils
.Wenn es auf Ihrer Plattform funktioniert, ist es eine elegante und recht intuitive Lösung. Aber die GNU-Leute denken immer noch nach.
quelle
grep
hier einen Fehler hat. Es ist aus POSIX nicht ersichtlich, welche Semantik beim Kombinieren zu beachten ist-c
und-o
sollte, sodass dies derzeit nicht portierbar ist. Danke für den Kommentar; Ich habe diese Antwort aktualisiert.Dieser Befehl führt Folgendes aus:
Zum Beispiel, wenn ich die erste Linus Torvald-Nachricht analysieren möchte:
Ich erstelle eine Datei mit dem Namen linus.txt , füge den Inhalt ein und schreibe dann in die Konsole:
Die Ausgabe wäre:
Wenn Sie nur die ersten 20 Wörter anzeigen möchten:
Es ist wichtig zu beachten, dass der Befehl tr 'AZ' 'a-z' UTF-8 noch nicht unterstützt , sodass das Wort APRÈS in Fremdsprachen als AprÈs übersetzt wird.
Wenn Sie nur nach dem Vorkommen eines Wortes suchen möchten, können Sie am Ende ein Grep einfügen:
In einem Skript namens search_freq :
Das Skript muss aufgerufen werden:
quelle
sed: -e expression #2, char 7: unterminated
s "Befehl", auch das zählt alle Wörter, oder? Aber OP fragte nur einen bestimmten. Auch ein bisschen Erklärung wäre schön.Je nachdem, ob Sie das Wort in den Schlüsseln oder in den Werten der JSON-Daten abgleichen möchten, möchten Sie wahrscheinlich nur Schlüssel oder nur Werte aus den Daten extrahieren. Andernfalls können Sie einige Wörter zu oft zählen, wenn sie sowohl als Schlüssel als auch als Werte vorkommen.
So extrahieren Sie alle Schlüssel:
Dies prüft rekursiv, ob das aktuelle Objekt ein Objekt ist, und wenn dies der Fall ist, werden die Schlüssel extrahiert. Die Ausgabe ist eine Liste von Schlüsseln, eine pro Zeile.
So extrahieren Sie alle Werte:
Dies funktioniert auf ähnliche Weise, hat jedoch weniger Schritte.
Sie können dann die Ausgabe des obigen Befehls durch
grep -c 'PATTERN'
(um ein Muster mit den Schlüsseln oder Werten abzugleichen), odergrep -c -w -F 'WORD'
(um ein Wort in den Schlüsseln oder Werten abzugleichen) odergrep -c -x -F 'WORD'
(um einen vollständigen Schlüssel oder Wert abzugleichen) oder Ähnliches zu leiten Zähle.quelle
Ich habe Json mit so etwas:
"number":"OK","number":OK"
mehrmals in einer Zeile wiederholt.Mein einfacher "OK" Zähler:
sed "s|,|\n|g" response | grep -c OK
quelle
Ich habe unter awk Befehl verwendet, um die Anzahl der Vorkommen zu finden
Beispieldatei
Katzendatei1
Befehl:
Ausgabe
quelle
awk '{sum+=gsub("praveen","")} END {print sum+0}'
.