Bash를 사용하여 텍스트 파일에서 어휘 목록을 만드는 방법은 무엇입니까?

Bash를 사용하여 텍스트 파일에서 어휘 목록을 만드는 방법은 무엇입니까?

텍스트 파일이 주어지면 파일에 있는 단어와 해당 빈도를 출력하고 싶습니다. 예를 들어 텍스트 파일에 "I really likeburgers"가 포함되어 있으면 출력은 다음과 같아야 합니다.

Burgers 1
I 1
Love 1
Really 2

답변1

테스트 파일:

$ cat filename.txt 
I really really   love burgers

cat filename.txt \
    | tr -s ' ' '\n' \
    | sort \
    | uniq -c \
    | sort -n -r \
    | awk '{ print $2 " " $1 }'

산출:

really 2
love 1
I 1
burgers 1

모든 것을 분해하고 각 단계를 설명하겠습니다. 먼저 파일은 cat에 의해 인쇄됩니다 stdout.

cat fileanme.txt

그런 다음 출력을 전달하면 모든 공백( )이 줄 바꿈( )으로 대체 cat됩니다 . tr이 옵션은 공백을 압축하고 여러 공백을 하나로 바꿉니다. 단어 사이에 공백이 여러 개 있더라도 한 줄에 하나의 단어가 생성됩니다.' ''\n'-str'\n'

tr -s ' ' '\n'

우리가 전달하는 단어 목록입니다 sort. 그러면 단어가 알파벳순으로 정렬됩니다.

sort

정렬된 단어 목록을 전달하면 uniq고유한 단어 목록이 출력됩니다. uniq목록을 정렬해야 합니다. -c플래그 출력은 각 단어 이전에도 계산됩니다. 카운터는 각 줄의 시작 부분에 몇 개의 공간을 예약합니다. 이렇게 하면 정렬된 단어가 생성됩니다. 이러한 공백은 다음 단계에서 제거됩니다.

uniq -c

이제 카운터별로 단어를 정렬할 수 있습니다. 각 행(카운터)의 첫 번째 단어를 사용하여 숫자로 정렬 -n됩니다 . 결과를 반전시키는 옵션(가장 높은 카운터부터).sort-r

sort -n -r

마지막으로 awk를 사용하여 print모든 줄에 대해 단어와 카운터를 교환합니다. 불필요한 공백은 무료로 정리됩니다( awk공백을 필드 구분 기호로 사용하고 여러 공백을 축소함).

각 행에 대해 다음을 수행합니다 print.

  • $2두 번째 필드(워드)
  • " "- 단일 공간
  • $1- 카운터
awk '{ print $2 " " $1 }'

관련 정보