Mam duży plik JSON, który znajduje się w jednym wierszu i chcę użyć wiersza polecenia, aby móc policzyć liczbę wystąpień słowa w pliku. Jak mogę to zrobić?
bash
command-line
grep
json
mit
źródło
źródło
{ "key": "the key" }
powinno liczyć ciągkey
raz czy dwa razy.Odpowiedzi:
Gdzie
tr
zamienia spacje na nowe linie,grep
filtruje wszystkie wynikowe linie pasujące do WORD iwc
zlicza pozostałe.Można nawet zapisać
wc
część, używając-c
opcji grep:-c
Opcja jest zdefiniowany przez POSIX.Jeśli nie ma gwarancji, że między słowami są spacje, musisz użyć innego znaku (jako separatora) do zastąpienia. Na przykład
tr
są części alternatywnelub
jeśli chcesz zastąpić podwójne lub pojedyncze cudzysłowy. Oczywiście możesz także użyć
tr
do zamiany wielu znaków jednocześnie (pomyśl o różnych rodzajach białych znaków i interpunkcji).Jeśli musisz policzyć WORD, ale nie przedrostek WORD, WORDsuffix lub prefixWORDsuffix, możesz zawrzeć wzorzec WORD w znacznikach początku / końca linii:
W naszym kontekście, który jest równoważny znacznikom początku / końca słowa:
źródło
tr
polecenie, które wykona zadanie, zamiast sugerować przykłady, które nigdy nie będą działać we wszystkich sytuacjach. Dopasuje również słowa zawierające szukane słowo.grep -o '\<WORD\>' | wc -l
Rozwiązanie jest o wiele lepszy.W przypadku GNU grep działa to:
grep -o '\<WORD\>' | wc -l
-o
drukuje każdą dopasowaną część każdej linii na osobnej linii.\<
potwierdza początek słowa i\>
zapewnia koniec słowa (podobny do Perla\b
), więc zapewnia to, że nie dopasujesz łańcucha w środku słowa.Na przykład,
źródło
grep -wo WORD | wc -l
To niestety nie działa z GNU
coreutils
.Jeśli działa na twojej platformie, jest to eleganckie i dość intuicyjne rozwiązanie; ale ludzie GNU wciąż myślą.
źródło
grep
ma tutaj błąd. Nie jest jasne, z POSIX co semantyka łączy-c
i-o
powinno być więc ta obecnie nie jest przenośny. Dziękuję za komentarz; Zaktualizowałem tę odpowiedź.To polecenie sprawia, że:
Na przykład, jeśli chcę przeanalizować pierwszą wiadomość Linusa Torvalda:
Tworzę plik o nazwie linus.txt , wklejam zawartość, a następnie piszę w konsoli:
Wyjście byłoby:
Jeśli chcesz wizualizować tylko pierwsze 20 słów:
Ważne jest, aby pamiętać, że polecenie tr „AZ” „A-Z” nie suport UTF-8 jeszcze tak, że w językach obcych apres słowne byłyby tłumaczone jako Apres.
Jeśli chcesz wyszukać tylko jedno słowo, możesz dodać grep na końcu:
W skrypcie o nazwie search_freq :
Skrypt musi zostać wywołany:
źródło
sed: -e expression #2, char 7: unterminated
„polecenie”, to także liczy wszystkie słowa, prawda? Ale OP poprosił tylko o jeden. Przydałoby się również trochę wyjaśnienia.W zależności od tego, czy chcesz dopasować słowo w kluczach, czy w wartościach danych JSON, prawdopodobnie będziesz chciał wyodrębnić tylko klucze lub tylko wartości z danych. W przeciwnym razie możesz przeliczyć niektóre słowa zbyt wiele razy, jeśli występują zarówno jako klucze, jak i wartości.
Aby wyodrębnić wszystkie klucze:
To rekurencyjnie sprawdza, czy bieżąca rzecz jest obiektem, a jeśli tak, to wyodrębnia klucze. Wynikiem będzie lista kluczy, po jednym w wierszu.
Aby wyodrębnić wszystkie wartości:
Działa to w podobny sposób, ale ma mniej kroków.
Następnie możesz potokować wynik powyższego
grep -c 'PATTERN'
(aby dopasować jakiś wzorzec do kluczy lub wartości), lubgrep -c -w -F 'WORD'
(aby dopasować słowo w kluczach lub wartościach), lubgrep -c -x -F 'WORD'
(aby dopasować pełny klucz lub wartość), lub podobny, do licz swoje.źródło
Mam JSON z czymś takim:
"number":"OK","number":OK"
powtarzane wiele razy w jednym wierszu.Mój prosty licznik „OK”:
sed "s|,|\n|g" response | grep -c OK
źródło
Użyłem poniżej polecenia awk, aby znaleźć liczbę wystąpień
przykładowy plik
plik kota 1
Komenda:
wynik
źródło
awk '{sum+=gsub("praveen","")} END {print sum+0}'
.