모든 단어의 텍스트 파일 단어 발생 횟수 가져 오기 및 정렬 된 인쇄 출력


28

텍스트 파일을 통해 작동하고 모든 단어를 세어 다음과 같이 인쇄하는 명령이 있습니다.

user@box $˜ magic-command-i-forgot | with grep | and awk | sort ./textfile.txt
66: the
54: and
32: I
16: unix
12: bash
5:  internet
3:  sh
1: GNU/Linux

따라서 한 줄씩 검색하지 않고 단어별로 검색하며 1 단어뿐만 아니라 모든 단어에 대해서도 검색합니다. 오래 전에 인터넷 어딘가에서 찾았지만 찾을 수 없거나 기억할 수 없습니다.

답변:


33

나는 awktr 대신에 사용할 것이다 :

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr 공백을 줄 바꿈으로 바꿉니다.
  • grep -v "^\s*$" 빈 줄을 다듬다
  • sort 입력으로 준비 uniq
  • uniq -c 발생 횟수를 계산
  • sort -bnr 공백을 무시하고 숫자 역순으로 정렬

와우. 그것은 욕설 을 세는 훌륭한 명령으로 판명되었습니다.

찾기 -name "* .py"-exec cat {} \; | tr '[: space :]' '[\ n *]'| grep -v "^ \ s * $"| 정렬 | uniq -c | 정렬 -bnr | grep fuck


tr -s특히 들여 쓰기가 발생할 때 여러 공간을 처리하는 데 사용할 수 있습니다.
Arcege

@Arcege : 좋은 지적입니다. 결과를 변경하지는 않지만 스크립트를 약간 조일 수 있습니다.
seler

-g경우에 따라 ( --general-numeric-sort) 옵션 sort이 바람직 할 수 있습니다. 예는 sort -n계속됩니다 10\n1 4치료,있는 그대로 1 414있는 동안, sort -g로 올바르게 처리합니다 1 4\n10.
Skippy le Grand Gourou

좋은 명령, 정말 투표를해야합니다 :)
Noor

@seler 나는 grep과 tr 부분을 아래와 같이 더 간단하게 만들 수 있다고 생각합니다 echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnr.
smc

8
  1. 입력을 한 줄에 하나씩 단어로 나눕니다.
  2. 결과 단어 목록 (줄)을 정렬하십시오.
  3. 여러 번의 스쿼시.
  4. 발생 횟수를 기준으로 정렬합니다.

입력을 단어로 나누려면 단어 구분 기호로 간주되는 모든 문자를 줄 바꿈으로 바꿉니다.

<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
                             # them word constituents
sort |
uniq -c |
sort -nr

이것은 단어가 무시하려는 단어가 아닌 구두점 바로 옆에있는 경우를 처리 할 수 ​​있기 때문에 좋은 대답입니다.
David Grayson

5

grep과 awk를 사용하지 않지만 원하는 것을하는 것처럼 보입니다.

for w in `cat maxwell.txt`; do echo $w; done|sort|uniq -c
  2 a
  1 A
  1 an
  1 command
  1 considered
  1 domain-specific
  1 for
  1 interpreter,
  2 is
  1 language.
  1 line
  1 of

1
입력에 쉘 와일드 카드 ( set -f)를 포함하고 구두점을 단어의 일부로 처리 하는 경우에는 작동하지 않습니다 ( 구두 문자를 추가하여 어색하게 수정할 수 있음 IFS). 이것은 전체 파일을 메모리에 저장하기 때문에 매우 큰 입력 파일에는 좋지 않습니다 ( sort더 똑똑합니다).
질 'SO-정지 존재 악마'

2

당신이 이런 식으로 믿었다 고요?

$ perl -n -e 'foreach ${k} (split(/\s+/)){++$h{$k}};END{foreach $l (keys(%h)){print "$h{$l}: ${l}\n"}}' /path/to/your/file | sort -n -k 1

물론 당신도 함께 할 수 awk있습니다 :)


2

awk/sort/uniq솔루션 사용 :

awk '{for(w=1;w<=NF;w++) print $w}' ~/textFile.txt | sort | uniq -c | sort -nr

아름다운! 이것은 완벽하게 작동했습니다.
stidmatt

0
file=/home/stefan/ooxml1.txt
for word in $(sed 's/[^A-Za-z]/ /g' $file | tr " " "\n" | sort -u)
do
  echo -n "$word "
  grep -c $word $file
done | sort -k2 -n 

파일을 단어로 분할 한 후 오름차순으로 정렬합니다.

간단한의 GREP은 찾을 수 fish에서 fisheye당신은 부분적으로 일치하는 것을 방지하기 위해 grep 명령을 향상 할 수 있도록.

클래식 HDD (IDE) 시대의 컴퓨터에서 25k 텍스트 파일에 약 3 초가 걸립니다.

더 큰 파일 또는 종종 수행되는 작업의 경우 해시 맵 접근 방식이 더 좋지만 드물게 실행되는 작업이나 작은 파일의 경우 충분할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.