Bash 列出文本文件中的所有单词及其出现次数?
假设我有如下文件Bash 列出文本文件中的所有单词及其出现次数?,bash,sed,awk,Bash,Sed,Awk,假设我有如下文件text.txt: 她喜欢猫,他也喜欢猫。 我希望我的结果如下所示: she 1 likes 2 cats 2 and 1 he 1 too 1 如果将空格、.放入其中会使脚本更容易,那就好了 有没有一个简单的壳牌管道可以做到这一点?这是一个离我心不远的内衬: cat text.txt | sed 's|[,.]||g' | tr ' ' '\n' | sort | uniq -c sed去除标点符号(根据口味调整正则表达式),tr将结果每行一个单词。使用GNU awk,您可
text.txt
:
她喜欢猫,他也喜欢猫。
我希望我的结果如下所示:
she 1
likes 2
cats 2
and 1
he 1
too 1
如果将空格、.
放入其中会使脚本更容易,那就好了
有没有一个简单的壳牌管道可以做到这一点?这是一个离我心不远的内衬:
cat text.txt | sed 's|[,.]||g' | tr ' ' '\n' | sort | uniq -c
sed去除标点符号(根据口味调整正则表达式),tr将结果每行一个单词。使用GNU awk,您可以将记录分隔符(RS)指定为任意非字母字符序列:
$ gawk -v RS='[^[:alpha:]]+' '{sum[$0]++} END{for (word in sum) print word,sum[word]}' file
she 1
likes 2
and 1
too 1
he 1
cats 2
但这并不能解决你如何识别“单词”的问题。UOOC和sed将把“foo,bar”合并成一个单词“foobar”。这是公平的。使用类似于
“s |[,.]| | g'
的模式,其中替换模式包括空格,可以避免这些连接。如果短语是“我的一只猫重500磅,那只猫超大!”-是一只猫加上一只猫还是其他什么?那句话里有一个“s”字吗?有一个单词“500”和一个单词“lbs”或一个单词“500lbs”或其他什么吗?有一个词“超级”和一个词“大小”还是一个词“超级大小”?