我得到了一个 txt 文件(战争与和平..),我需要创建一个按字母顺序排序的所有出现 10 次或以上的单词(没有数量)的文本文件。
这个问题的不同之处在于,每个标点符号都被视为一个新单词的开头,这意味着 youre 被视为两个单词,youre。
我将所有标点符号翻转为新行,并将所有空格翻转为新行。我使用了trim -c,所以现在我有了所有单词及其计数,不知道如何只显示那些出现10次或更多次的单词。
如果您能提供有关查找所有出现 10 次或以上的单词的方法的帮助,我们将不胜感激!
答案1
< text tr -cs '[:alnum:]' '[\n*]' |
awk '++count[$0] == 10' |
sort
如果您想忽略大小写,请替换$0
为。tolower($0)
那t翻译s的字符序列是C的补充阿尔法编号埃里克的n埃林斯。awk
打印每个出现的第 10 次。
注意在 GNU 系统上,tr
不能正确处理多字节字符。但是,在这些系统上,您可以使用 GNUgrep
的-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 系统上,这仍然可能会给出错误的结果,因为 Unicode 组合重音例如被分类为标点并不是校友(尽管重音字符采用组合形式,但它们不会出现在该文本中)。
答案2
如果您已经从文件中删除了点和空格,并且其中只有单词,如您的评论中所述(没有额外的空格/制表符),那么您可以使用sort
,uniq
和awk
来获得您想要的内容:
sort file_with_words | uniq -c | awk '{ if ($1 >= 10) { print}}'
我的解决方案仅在文件格式正确时才有效(一个字/行,没有多余的空格/制表符)。
答案3
在 Perl 中:
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