如何保留文本中的's'?提取含撇号单词的命令优化问题
这个问题我碰到过好几次啦——核心是原命令里的tr没有把撇号当成单词的一部分,所以才把dog's拆成了两个词。咱们来一步步解决:
1. 快速修复:调整tr的保留字符集
原命令里的tr -cs '[:alnum:]' '[*\n]'只把字母数字视为单词的组成部分,撇号被归类为“非单词字符”,会被替换成分隔符,直接导致dog's拆成dog和s。
我们只需要把撇号加入到tr要保留的字符集中,就能让dog's完整被识别为一个单词:
cat simple2.txt | tr -cs "[:alnum:]'" '\n' | sort | uniq -c | sort -nr | head -10
这里把原命令的[:alnum:]改成了[:alnum:]',tr只会把除字母数字和撇号之外的字符替换成换行,统计结果就会变成你期望的:1 the 1 dog's。
2. 更严谨的方案:用awk处理复杂场景
如果你的文本里还有其他混杂的标点(比如dog's!或者"the"),上面的tr可能还会保留多余符号。这时候用awk更灵活,能先清理单词再统计:
awk '{ for(i=1;i<=NF;i++){ # 去掉单词首尾的非字母数字/撇号字符 gsub(/^[^[:alnum:]']+|[^[:alnum:]']+$/,"",$i) if($i != "") count[$i]++ } } END{ for(word in count) print count[word], word }' simple2.txt | sort -nr | head -10
这个命令会先把每个单词首尾的垃圾字符(比如引号、感叹号)去掉,再进行统计,适合处理更复杂的文本内容。
内容的提问来源于stack exchange,提问作者Parth Parikh
相关产品推荐
相关产品推荐

