저는 여러 파일을 입력으로 사용하고 각 파일에 대해 가장 자주 발생하는 상위 'n' 단어를 내림차순으로 표시하는 bash 스크립트를 작성 중입니다.
파일 1개에 대한 단어 빈도를 계산하는 방법을 알아냈는데 파일이 여러 개 있어서 병렬로 처리할 때 어떻게 처리해야 할지 모르겠습니다.
sed -e 's/[^[:alpha:]]/ /g' testfile.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl
이것은 1개의 파일에 대해 잘 작동하지만 다음과 같이 실행할 수 있는 bash 스크립트를 작성하고 싶습니다.
$countWord test1.txt test2.txt test3.txt (countword here is my bash script that counts freq)
이 파일을 입력으로 사용하고 각 파일에 대해 다음과 같은 내용을 표시하고 싶습니다.
===(1 51 33 test1.txt)==== # where 1: number of lines, 51: number of words, 33: number of characters
38 them
29 these
17 to
12 who
올바른 방향으로 도움을 주시면 대단히 감사하겠습니다. :)
답변1
파일에 대한 루프 만들기
for F in "$@"
do echo "=== $F ==="
sed -e 's/[^[:alpha:]]/ /g' "$F" | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl
done
재미있게 보내세요!
답변2
다음 입력을 사용하세요.
$ head file1 file2
==> file1 <==
I am new here. I am working on writing a bash script which takes multiple files
as input and display the top ‘n’ most frequently occurring words in
descending order for each of file.
==> file2 <==
I figured out how to count the frequency of words but I am unable to figure out
how I will deal when I have multiple files.
그리고 쉘 스크립트의 GNU awk:
$ cat tst.sh
#!/usr/bin/env bash
awk '
BEGIN { maxWords = 5 }
{
gsub(/[^[:alpha:]]/," ")
for (i=1; i<=NF; i++) {
words[$i]++
split($i,tmp)
for (j in tmp) {
chars[tmp[j]]++
}
}
}
ENDFILE {
print " ===(" FNR+0, length(words)+0, length(chars)+0, FILENAME ")==="
PROCINFO["sorted_in"] = "@val_num_desc"
numWords = 0
for (word in words) {
print words[word], word
if ( ++numWords == maxWords ) {
break
}
}
delete cnt
delete chars
}
' "${@:--}"
우리는 다음을 얻었습니다:
$ ./tst.sh file1 file2
===(3 32 32 file1)===
2 am
2 I
1 writing
1 working
1 words
===(2 45 20 file2)===
6 I
3 am
2 words
2 to
2 the