소설, 논픽션, 신문 기사 등이 포함된 텍스트 파일이 많이 있다고 가정해 보겠습니다. (특정 언어로 된 텍스트의 무작위 예)
가장 일반적인 단어가 먼저 포함된 특정 단어의 빈도 목록을 원합니다.
이를 위해 C 코드를 작성할 수 있지만 더 빠른 방법이 있다면 알고 싶습니다. (더 빠르다는 것은 실행 시간이 아니라 인코딩 시간을 의미합니다.)
답변1
더 빠른 코딩 시간을 위해 지금 성공적으로 시도한 방법은 다음과 같습니다.
printf '%s\n' $(cat *.txt) | sort | uniq -c | sort -gr | less
답변2
C로 작성하면 런타임이 빨라질 수 있지만 작성하는 데 시간이 더 오래 걸립니다. 좋은 절충안은 awk를 사용하는 것입니다.
count.awk
FNR == NR { pat[$1] = 1; next }
{
for(p in pat)
if(index($0, p))
pat[p]++
}
END {
for(p in pat)
print pat[p]-1, p
}
먼저 단어 목록(한 줄에 한 단어)을 읽은 다음 나머지 입력에서 일치하는 항목을 계산합니다. 다음과 같이 실행하세요:
cat *.txt | awk -f tally.awk wordlist - | sort -nr
위의 코드는 하위 문자열과도 일치합니다. 전체 단어만 일치시키려면 index
해당 줄을 다음으로 바꾸십시오.
if(match($0, "\\<" p "\\>"))
답변3
다음과 같이 할 수 있습니다(GNU grep 사용).
grep -hEo "[[:alnum:]_'-]+" ./*.txt | sort | uniq -c | sort -rn
위의 내용을 [:alnum:]_'-
단어 구성 요소로 변경합니다.