txt 파일(전쟁과 평화..)을 받았는데 10번 이상(숫자 없음) 나타나는 모든 단어가 알파벳순으로 정렬된 텍스트 파일을 만들어야 합니다.
이 질문의 차이점은 각 문장 부호가 새 단어의 시작으로 처리된다는 것입니다. 즉, youre는 두 단어, youre로 처리된다는 의미입니다.
모든 구두점을 새 줄로 바꾸고 모든 공백을 새 줄로 바꿉니다. 나는 Trim -c를 사용하여 이제 모든 단어와 그 개수를 얻었지만 10번 이상 나타나는 단어만 표시하는 방법을 잘 모르겠습니다.
10번 이상 나오는 모든 단어를 찾는 방법에 대해 도움을 주시면 감사하겠습니다!
답변1
< text tr -cs '[:alnum:]' '[\n*]' |
awk '++count[$0] == 10' |
sort
대소문자를 무시하려면 $0
로 바꾸세요.tolower($0)
저것티번역하다에스문자 순서는 다음과 같습니다.씨보충알법일련번호에릭의N에린스. awk
각 발생의 10번째 발생을 인쇄합니다.
알아채다GNU 시스템에서는 tr
멀티바이트 문자가 올바르게 처리되지 않습니다.. 그러나 이러한 시스템에서는 grep
GNU 확장을 사용할 수 있습니다 -o
.
< text grep -Eo '[[:alnum:]]+' |
awk '++count[$0] == 10' |
sort
다음과 같이 변경할 수 있습니다.
< text grep -Eo '[^[:punct:][:space:]]+' |
awk '++count[$0] == 10' |
sort
둘 다 아닌 캐릭터를 생각해 보세요.가리키다평가도 안되고공간(또는 tr -s '[:punct:][:space:]' '[\n*]'
GNU가 아닌 시스템이나 전체 ASCII 텍스트 이상)전쟁과 평화 텍스트동일한 결과를 제공합니다.
유니코드 결합 악센트는 다음과 같이 분류되므로 적어도 GNU 시스템에서는 여전히 잘못된 결과가 나올 수 있습니다.구두설마동문(악센트 문자가 결합되어 있지만 이 텍스트에는 표시되지 않습니다.)
답변2
파일에서 점과 공백을 제거하고 주석에 명시된 단어만 있는 경우(추가 공백/탭 없음) , 를 사용하여 sort
원하는 uniq
것을 awk
얻을 수 있습니다.
sort file_with_words | uniq -c | awk '{ if ($1 >= 10) { print}}'
내 솔루션은 파일 형식이 올바른 경우에만 작동합니다(단어/줄 1개, 추가 공백/탭 없음).
답변3
펄에서는:
perl -e 'while(<>){while(/([[:alpha:]]+)/g){$c{$&}++}};foreach $w(keys %c){if($c{$w}<10){delete $c{$w}}};foreach $w(sort keys %c){print "$w\n"}' WarAndPeace.txt
들여 쓰기:
perl -e '# Let s count every words
while(<>){
while(/([[:alpha:]]+)/g){
$c{$&}++
}
}
# Let s remove lesser than 10
foreach $w(keys %c){
if($c{$w}<10){
delete $c{$w}
}
}
# Let s sort and print
foreach $w(sort keys %c){
print "$w\n"
}' WarAndPeace.txt
UTF-8을 사용하십시오:
perl -e 'use open qw/:std :utf8/;
# Let s count every words
while(<>){
while(/([[:alpha:]]+)/g){
$c{$&}++
}
}
# Let s remove lesser than 10
foreach $w(keys %c){
if($c{$w}<10){
delete $c{$w}
}
}
# Let s sort and print
foreach $w(sort keys %c){
print "$w\n"
}' WarAndPeace.txt