한 줄에 큰 JSON 파일이 있고 파일에서 단어의 발생 횟수를 계산할 수 있도록 명령 줄을 사용하고 싶습니다. 어떻게해야합니까?
답변
$ tr ' ' '\n' < FILE | grep WORD | wc -l
tr
공백을 개행 문자로 바꾸는 경우 grep
WORD와 일치하는 모든 결과 행을 필터링 wc
하고 나머지 행을 계산합니다.
grep 옵션을 wc
사용하여 부품을 저장할 수도 있습니다 -c
.
$ tr ' ' '\n' < FILE | grep -c WORD
이 -c
옵션은 POSIX에 의해 정의됩니다.
단어 사이에 공백이 있다고 보장되지 않으면 다른 문자 (구분 기호로)를 바꿔야합니다. 예를 들어 대체 tr
부품은
tr '"' '\n'
또는
tr "'" '\n'
큰 따옴표 나 작은 따옴표를 바꾸려면 물론 tr
여러 문자를 한 번에 바꾸는 데 사용할 수도 있습니다 (다른 종류의 공백과 문장 부호를 생각하십시오).
접 두부 WORD, WORDsuffix 또는 prefixWORDsuffix가 아닌 WORD를 계산해야하는 경우 WORD 패턴을 시작 / 끝 줄 표시 자로 묶을 수 있습니다.
grep -c '^WORD$'
다음과 같은 맥락에서 단어 시작 / 끝 마커와 같습니다.
grep -c '\<WORD\>'
답변
GNU grep을 사용하면 다음과 같이 작동합니다. grep -o '\<WORD\>' | wc -l
-o
각 줄의 일치하는 각 부분을 별도의 줄에 인쇄합니다.
\<
단어의 시작을 주장하고 단어 \>
의 끝을 주장합니다 (Perl과 유사 \b
). 이렇게하면 단어 중간에있는 문자열과 일치하지 않습니다.
예를 들어
$ python -c '가져 오기'| grep '\ <one \>' 이 있어야 하나 만을 바람직하고 - 하나 그것을 할 --obvious 방법. 네임 스페이스는 훌륭한 아이디어 중 하나입니다. 더 많은 것을 해보자! $ python -c '가져 오기'| 그렙 -o '\ <하나 \>' 하나 하나 하나 개 $ 파이썬 -c '이 가져올'| grep -o '\ <one \>'| 화장실 -l 삼
답변
불행히도 GNU 에서는 작동하지 않습니다coreutils
.
grep -o -c WORD file
플랫폼에서 작동한다면 우아하고 직관적 인 솔루션입니다. 그러나 GNU 사람들은 여전히 생각하고 있습니다.
답변
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl
이 명령은 다음을 수행합니다.
- 영숫자가 아닌 모든 문자를 공백으로 대체하십시오.
- 모든 줄 바꿈도 공백으로 변환됩니다.
- 모든 여러 공백을 하나의 공백으로 줄입니다.
- 모든 공백이 줄 바꿈으로 변환되었습니다. 한 줄에있는 각 단어.
- ‘Hello’와 ‘hello’가 다른 단어가되지 않도록 모든 단어를 소문자로 번역
- 텍스트 정렬
- 같은 줄을 세고 제거
- 가장 빈번한 단어를 계산하기 위해 역순으로 정렬
- 전체에서 단어 위치를 알기 위해 각 단어에 줄 번호를 추가하십시오.
예를 들어 첫 번째 Linus Torvald 메시지를 분석하려는 경우 :
From : torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds) 뉴스 그룹 : comp.os.minix 주제 : Minix에서 가장보고 싶은 것은 무엇입니까? 요약 : 새 운영 체제에 대한 소규모 설문 조사 Message-ID : <1991Aug25.205708.9541@klaava.Helsinki.FI> 날짜 : 91 8 월 91 일 20:57:08 GMT 조직 : 헬싱키 대학
안녕하십니까?
386 (486) AT 클론에 대해 (무료) 운영 체제 (단지 취미는 gnu와 같이 크고 전문적이지 않습니다)를하고 있습니다. 이것은 4 월부터 양조되어 준비를 시작하고 있습니다. OS가 사람들과 다소 비슷하기 때문에 (실제적인 이유로 파일 시스템의 물리적 레이아웃과 유사) Minix에서 사람들이 좋아하거나 싫어하는 것에 대한 피드백을 원합니다.
현재 bash (1.08) 및 gcc (1.40)을 이식했으며 작동하는 것 같습니다. 이것은 몇 달 안에 실용적인 것을 얻게 될 것이며 대부분의 사람들이 원하는 기능을 알고 싶습니다. 모든 제안은 환영하지만 구현할 것이라고 약속하지는 않습니다. ?
리누스 (torvalds@kruuna.helsinki.fi)
추신. 그렇습니다 – 모든 미니 코드가 없으며 멀티 스레드 fs가 있습니다. 그것은 (386 작업 전환 등을 사용하여) protable하지 않으며 아마 AT 하드 디스크 이외의 다른 것을 지원하지 않을 것입니다.
linus.txt 라는 파일을 만들고 내용을 붙여 넣은 다음 콘솔에 씁니다.
sed -e 's/[^[:alpha:]]/ /g' linus.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl
결과는 다음과 같습니다.
1 7 i
2 5 to
3 5 like
4 5 it
5 5 and
6 4 minix
7 4 a
8 3 torvalds
9 3 of
10 3 helsinki
11 3 fi
12 3 any
13 2 would
14 2 won
15 2 what
16 ...
처음 20 개 단어 만 시각화하려면 다음을 수행하십시오.
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | head -n 20
tr ‘AZ’ ‘a-z’ 명령 은 아직 UTF-8을 지원하지 않으므로 외국어에서는 APRÈS라는 단어가 aprÈs로 번역됩니다.
한 단어의 발생 만 검색하려는 경우 끝에 grep을 추가 할 수 있습니다.
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\sword_to_search_for$"
search_freq 라는 스크립트에서 :
#!/bin/bash
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\s$1$"
스크립트는 다음과 같이 호출되어야합니다.
search_freq word_to_search_for
답변
키의 단어 또는 JSON 데이터의 값과 일치하는지에 따라 키에서 데이터 만 추출하거나 데이터에서 값만 추출 할 수 있습니다. 그렇지 않으면 일부 단어가 키와 값으로 나타날 경우 단어를 너무 많이 계산할 수 있습니다.
모든 키를 추출하려면
jq -r '..|objects|keys[]' <file.json
이것은 현재 사물이 객체인지 여부를 재귀 적으로 테스트하고, 그렇다면 사물을 추출합니다. 출력은 한 줄에 하나씩 키 목록이됩니다.
모든 값을 추출하려면
jq -r '..|scalars' <file.json
이것은 비슷한 방식으로 작동하지만 단계가 적습니다.
그런 다음 위의 출력을 grep -c 'PATTERN'
(키 또는 값과 일부 패턴과 일치 시키거나) 또는 grep -c -w -F 'WORD'
( 키 또는 값 의 단어 와 일치시키기 위해 ) 또는 grep -c -x -F 'WORD'
(완전한 키 또는 값과 일치시키기 위해) 또는 유사하게 당신의 계산을 수행합니다.
답변
나는 다음과 같은 json을 가지고있다 : "number":"OK","number":OK"
한 줄에 여러 번 반복했다.
간단한 “OK”카운터 :
sed "s|,|\n|g" response | grep -c OK
답변
awk 명령 아래에서 발생 횟수를 찾았습니다.
예제 파일
고양이 파일 1
praveen ajay
praveen
ajay monkey praveen
praveen boy praveen
명령:
awk '{print gsub("praveen",$0)}' file1 | awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'
산출
awk '{print gsub("praveen",$0)}' file1 | awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'
5