it-swarm-ko.tech

명령 줄을 사용하여 텍스트 파일에서 Word의 발생 횟수를 어떻게 계산합니까?

한 줄에 큰 JSON 파일이 있고 명령 줄을 사용하여 파일에서 Word의 발생 횟수를 계산하려고합니다. 어떻게해야합니까?

45
mythz
$ tr ' ' '\n' < FILE | grep Word | wc -l

tr가 공백을 개행 문자로 바꾸는 경우, grep는 Word와 일치하는 모든 결과 행을 필터링하고 wc는 나머지 행을 계산합니다.

Grep의 -c 옵션을 사용하여 wc 부분을 저장할 수도 있습니다.

$ 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\>'
48
maxschlepzig

GNU grep 사용하면 다음과 같이 작동합니다. grep -o '\<Word\>' | wc -l

-o는 각 줄에서 일치하는 각 부분을 별도의 줄에 인쇄합니다.

\<는 단어의 시작을 주장하고 \>는 단어의 끝을 주장합니다 (Perl의 \b와 유사). 말씀의 중간.

예를 들어

$ python -c '이것을 가져 오기'| grep '\ <one \>'
 하나-바람직하게 만 하나 -명백한 방법입니다. 
 네임 스페이스는 하나 좋은 생각을 외치다-더 많은 것을 해보자! 
$ python -c '이것을 가져 오기'| grep -o '\ <one \>'
하나하나하나$ python -c '이것 가져 오기'| grep -o '\ <one \>'| wc -l 
 3 
25
ephemient

불행히도 는 GNU coreutils와 함께 작동하지 않습니다 .

grep -o -c Word file

플랫폼에서 작동하면 우아하고 직관적 인 솔루션입니다. 하지만 the GNU 사람들은 여전히 ​​생각하고 있습니다.

11
tripleee
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 

이 명령은 다음을 수행합니다.

  1. 영숫자가 아닌 모든 문자를 공백으로 대체하십시오.
  2. 모든 줄 바꿈도 공백으로 변환됩니다.
  3. 모든 여러 공백을 하나의 공백으로 줄입니다.
  4. 모든 공백은 이제 줄 바꿈으로 변환됩니다. 한 줄에있는 각 단어.
  5. 'Hello'와 'hello'가 다른 단어가되지 않도록 모든 단어를 소문자로 번역
  6. 텍스트 정렬
  7. 같은 줄을 세고 제거
  8. 가장 빈번한 단어를 계산하기 위해 역순으로 정렬
  9. 전체에서 단어 위치를 알기 위해 각 단어에 줄 번호를 추가하십시오.

예를 들어 첫 번째 Linus Torvald 메시지를 분석하려는 경우 :

From : [email protected] (Linus Benedict Torvalds) 뉴스 그룹 : comp.os.minix 주제 : Minix에서 가장보고 싶은 것은 무엇입니까? 요약 : 새 운영 체제에 대한 소규모 설문 조사 Message-ID : <[email protected]> 날짜 : 91 8 월 91 일 20:57:08 GMT 조직 : 헬싱키 대학교

안녕하십니까?

386 (486) AT 클론에 대해 (무료) 운영 체제 (단지 취미, gnu와 같이 크고 전문적이지 않음)를하고 있습니다. 이것은 4 월 이후 양조되었습니다. 내 OS가 (실제적인 이유 때문에) 파일 시스템의 물리적 레이아웃과 비슷하기 때문에 사람들이 미닉스에서 좋아하거나 싫어하는 것에 대한 피드백을 원합니다.

현재 bash (1.08) 및 gcc (1.40)을 이식했으며 작동하는 것 같습니다. 이것은 몇 달 안에 실용적인 것을 얻게 될 것이며 대부분의 사람들이 원하는 기능을 알고 싶습니다. 어떤 제안이라도 환영하지만, 그 제안을 이행하겠다고 약속하지는 않겠습니까 ????

리누스 ([email protected])

추신. 그렇습니다 – 모든 미니 코드가 없으며 멀티 스레드 fs가 있습니다. 그것은 가능하지 않으며 (386 작업 전환 등을 사용합니다) 아마 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을 지원하지 않습니다. yet , 외국어로 단어 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
7
Roger Borrell

키에서 또는 JSON 데이터의 값에서 Word를 일치시킬 것인지에 따라 데이터에서 키만 추출하거나 값만 추출 할 수 있습니다. 그렇지 않으면 일부 단어가 키와 값으로 나타날 경우 단어를 너무 많이 계산할 수 있습니다.

모든 키를 추출하려면

jq -r '..|objects|keys[]' <file.json

이것은 현재 사물이 객체인지 여부를 재귀 적으로 테스트하고, 있다면 사물을 추출합니다. 출력은 한 줄에 하나씩 키 목록이됩니다.

모든 값을 추출하려면

jq -r '..|scalars' <file.json

이것은 비슷한 방식으로 작동하지만 단계가 적습니다.

그런 다음 위의 출력을 grep -c 'PATTERN' (키 또는 값과 일부 패턴을 일치시키기 위해) 또는 grep -c -w -F 'Word' (키 또는 값의 Word와 일치) 또는 grep -c -x -F 'Word' (완전한 키 또는 값과 일치) 또는 유사하게 계산합니다.

3
Kusalananda

다음과 같은 json이 있습니다. "number":"OK","number":OK" 한 줄에 여러 번 반복되었습니다.

간단한 "OK"카운터 :

sed "s|,|\n|g" response | grep -c OK

0
khazad-dum_miner

grep -c 한 줄만 세면 한 줄에 여러 단어가 나타날 수 있습니다.

이것은 그것을 할 것입니다 :

grep -o Word foo|wc -l
0
Ramiro Velazquez