我想找到n文本文件中最常见的单词,但具有以下条件:
cat
获取文件。grep .
得到的话。tr -d '/r'
摆脱新线。
我已经设法让代码的后半部分与|sort | uniq -c | sort -nr| head -10
.
答案1
您提到了 的使用grep
,但如果目标是找到最常见的单词,我真的不认为有必要使用它。更有可能的是,您只想将文本文件拆分为单词,然后运行| sort | uniq -c | sort -nr | head -10
管道。
立即想到的解决方案(毫无疑问有许多替代解决方案)是通过以下方式使用正则表达式sed
:
sed 's/\s/\n/g'
\s
这只是说明用单个换行符 ( )替换所有空白字符 ( ) \n
。结合在一起,我认为你的解决方案看起来像这样:
cat [file] | sed 's/\s/\n/g' | sort | uniq -c | sort -nr | head -10 | awk '{print $2}'
我在最后添加了awk '{print $2}'
仅显示单词(而不是计数),但这完全取决于脚本的目的。
答案2
这听起来像是一项家庭作业。
cat
遵循、grep
和tr
、匹配大小写 (HE=He=he=hE) 以及以标点符号结尾的单词 (he.=he=he,=he!)的所有要求:
for word in $(
cat derp.txt | \
tr '[:upper:]' '[:lower:]' | \
tr -d '[:punct:]' | \
tr -d '/r'
)
do
words[$word]=$(cat derp.txt | grep -c $word)
echo "${words[$word]} $word" # lots of duplicate output that's filtered out below.
done | sort -u | tail -n 10
grep .
匹配所有内容,所以这是一个错字吗?
在这种情况下毫无意义,因为循环的tr -d '\r'
输入字段分隔符将空格和换行符视为分隔符。IFS
for
Jason K Lai 的解决方案可能是最好的。