여러 줄이 포함된 파일이 있습니다. 전체 파일에 나타나는 각 단어에 대해 해당 단어가 포함된 줄 수를 알고 싶습니다. 예를 들면 다음과 같습니다.
0 hello world the man is world
1 this is the world
2 a different man is the possible one
내가 기대하는 결과는 다음과 같습니다.
0:1
1:1
2:1
a:1
different:1
hello:1
is:3
man:2
one:1
possible:1
the:3
this:1
world:2
"world"의 개수는 3이 아니라 2입니다. 단어가 2줄에 나타나기 때문입니다. 따라서 공백을 줄 바꿈으로 변환하는 것은 정확한 해결책이 아닙니다.
답변1
또 다른 Perl 변형, 사용목록::유틸리티
$ perl -MList::Util=uniq -alne '
map { $h{$_}++ } uniq @F }{ for $k (sort keys %h) {print "$k: $h{$k}"}
' file
0: 1
1: 1
2: 1
a: 1
different: 1
hello: 1
is: 3
man: 2
one: 1
possible: 1
the: 3
this: 1
world: 2
답변2
Bash에서는 간단하게:
declare -A wordcount
while read -ra words; do
# unique words on this line
declare -A uniq
for word in "${words[@]}"; do
uniq[$word]=1
done
# accumulate the words
for word in "${!uniq[@]}"; do
((wordcount[$word]++))
done
unset uniq
done < file
데이터를 살펴보세요:
$ declare -p wordcount
declare -A wordcount='([possible]="1" [one]="1" [different]="1" [this]="1" [a]="1" [hello]="1" [world]="2" [man]="2" [0]="1" [1]="1" [2]="1" [is]="3" [the]="3" )'
그리고 필요에 따라 형식을 지정하세요.
$ printf "%s\n" "${!wordcount[@]}" | sort | while read key; do echo "$key:${wordcount[$key]}"; done
0:1
1:1
2:1
a:1
different:1
hello:1
is:3
man:2
one:1
possible:1
the:3
this:1
world:2
답변3
이것은 매우 간단한 Perl 스크립트입니다:
#!/usr/bin/perl -w
use strict;
my %words = ();
while (<>) {
chomp;
my %linewords = ();
map { $linewords{$_}=1 } split / /;
foreach my $word (keys %linewords) {
$words{$word}++;
}
}
foreach my $word (sort keys %words) {
print "$word:$words{$word}\n";
}
기본 아이디어는 각 줄에 대해 입력을 반복하고 단어로 분할한 다음 해당 단어를 해시(연관 배열)에 저장하여 중복 항목을 제거한 다음 단어 배열을 반복하고 해당 항목에 대한 전체 카운터에 추가하는 것입니다. 하나의 단어. 마지막으로 단어와 그 개수가 보고됩니다.
답변4
또 다른 간단한 대안은 Python(>3.6)을 사용하는 것입니다. 해결책은 @Larry가 그의 기사에서 언급한 것과 동일한 문제입니다.논평.
from collections import Counter
with open("words.txt") as f:
c = Counter(word for line in [line.strip().split() for line in f] for word in set(line))
for word, occurrence in sorted(c.items()):
print(f'{word}:{occurrence}')
# for Python 2.7.x compatibility you can replace the above line with
# the following one:
# print('{}:{}'.format(word, occurrence))
위의 내용을 보다 명시적으로 표현하면 다음과 같습니다.
from collections import Counter
FILENAME = "words.txt"
def find_unique_words():
with open(FILENAME) as f:
lines = [line.strip().split() for line in f]
unique_words = Counter(word for line in lines for word in set(line))
return sorted(unique_words.items())
def print_unique_words():
unique_words = find_unique_words()
for word, occurrence in unique_words:
print(f'{word}:{occurrence}')
def main():
print_unique_words()
if __name__ == '__main__':
main()
산출:
0:1
1:1
2:1
a:1
different:1
hello:1
is:3
man:2
one:1
possible:1
the:3
this:1
world:2
위의 내용도 가정합니다.워드.txt와 같은 디렉토리에 위치script.py. 이는 여기에 제공된 다른 솔루션과 크게 다르지 않지만 누군가가 유용하다고 생각할 수도 있습니다.