file.txt
다음 내용이 포함된 파일이 있습니다 .
I am groot, groot me, me groot,I love groot, groot groot, am I groot groot so
모든 단어를 개별적으로 계산하고 싶습니다.
단어 세기에는 다음 명령을 사용합니다.
tr ' ' '\n' < file.txt | grep "groot" | wc -l
하지만 모든 단어를 세는 방법이 있는지 알고 싶습니다. 원하는 출력은 다음과 같습니다.
word count
I 4
am 3
groot 8
me 2
bash 파일이나 bash 스크립트를 사용하여 수행할 수 있습니까? 도와주세요.
답변1
grep -o '\w\+' file.txt | sort | uniq -c
설명하다:
grep -o
각 일치 항목은 별도의 줄에 출력됩니다.\w\+
연속된 영숫자 문자와 일치합니다_
.uniq -c
각 연속 실행에 대해 반복되는 행의 발생 횟수가 출력됩니다.- 각 고유 단어를 하나의 연속적인 반복 줄로 그룹화하려면
sort
before가 필요합니다.uniq -c
답변2
표준 도구만 사용하십시오.
$ tr -sc '[:alpha:]' '\n' <file | sort | uniq -c
3 I
2 am
8 groot
1 love
2 me
1 so
단어가 아닌 각 문자를 개행 문자로 바꾸는 것부터 시작하세요. 우리는 단어가 아닌 문자를 "알파벳 문자가 아닌 모든 문자"로 정의합니다(이것은 명령줄에서 -c
수행 [:alpha:]
하는 작업 입니다). 두 개 이상의 연속 개행 결과 실행은 단일 개행으로 압축됩니다(이것은 명령줄에서 발생합니다).\n
tr
-s
tr
그런 다음 생성된 단어(한 줄에 한 단어)가 정렬되고 sort
각 단어의 발생 횟수가 계산됩니다.
sort | uniq -c
단일 프로그램을 사용하면 파이프라인 부분을 약간 더 시간 효율적으로 만들 수 있습니다 awk
.
$ tr -sc '[:alpha:]' '\n' <file | awk '{ count[$0]++ } END { for (word in count) print count[word], word }'
1 love
8 groot
2 am
3 I
1 so
2 me
코드 awk
는 단순히 읽은 각 단어를 tr
연관 배열의 키로 사용 count
하고 해당 단어를 볼 때마다 연관된 값을 증가시킵니다. 마지막으로 코드는 모든 단어의 개수를 인쇄합니다.