我有一个ASCII文本文件。我想使用一个或多个Ubuntu命令从该文件生成所有“单词”的列表。单词定义为分隔符之间的alpha-num序列。分隔符默认是空格,但我也想尝试其他字符,如标点符号等。换句话说,我希望能够指定分隔符字符集。我如何只生成一组独特的单词?如果我还想仅列出长度至少为N个字符的单词,该怎么办?
答案 0 :(得分:20)
您可以使用grep:
-E'\ w +'搜索单词 -o仅打印匹配行的部分 %cat temp 一些例子使用“快速的棕色狐狸跳过懒狗”, 而不是“Lorem ipsum dolor sit amet,consectetur adipiscing elit” 例如文本。
% grep -o -E '\w+' temp
Some
examples
use
The
quick
brown
fox
jumped
over
the
lazy
dog
rather
than
Lorem
ipsum
dolor
sit
amet
consectetur
adipiscing
elit
for
example
text
如果您只想打印每个单词一次,忽略大小写,您可以使用排序
-u只打印一次单词 -f告诉sort在比较单词
时忽略大小写% grep -o -E '\w+' temp | sort -u -f
adipiscing
amet
brown
consectetur
dog
dolor
elit
example
examples
for
fox
ipsum
jumped
lazy
Lorem
over
quick
rather
sit
Some
text
than
The
use
您也可以使用tr
命令
echo the quick brown fox jumped over the lazydog | tr -cs 'a-zA-Z0-9' '\n'
the
quick
brown
fox
jumped
over
the
lazydog
-c
用于指定字符的补充; -s
挤出了替换的重复; 'a-zA-Z0-9'是一组字母数字,如果你在这里添加一个字符,输入将不会在该字符上分隔(参见下面的另一个例子); '\ n'是替换字符(换行符)。
echo the quick brown fox jumped over the lazy-dog | tr -cs 'a-zA-Z0-9-' '\n'
the
quick
brown
fox
jumped
over
the
lazy-dog
当我们在非分隔符列表中添加' - '时,就会打印出懒狗。其他输出是
echo the quick brown fox jumped over the lazy-dog | tr -cs 'a-zA-Z0-9' '\n'
the
quick
brown
fox
jumped
over
the
lazy
dog
tr的摘要:任何不在-c
参数中的字符都将作为分隔符。我希望这也解决了你的分隔符问题。
答案 1 :(得分:0)
这应该适合你:
tr \ \\t\\v\\f\\r \\n | | tr -s \\n | tr -dc a-zA-Z0-9\\n | LC_ALL=C sort | uniq
如果您想要长度至少为五个字符的字符,请将tr
的输出通过grep .....
。如果您想要不区分大小写,请在tr A-Z a-z
之前在管道中的某个位置粘贴sort
。
请注意,LC_ALL=C
是sort
正常工作所必需的。
我建议您阅读man
页面,了解您在此处不理解的蚂蚁命令。
答案 2 :(得分:0)
这是我的词云般的链条
cat myfile | grep -o -E '\w+' | tr '[A-Z]' '[a-z]' | sort | uniq -c | sort -nr
如果您有tex文件,请将cat
替换为detex
:
detex myfile | grep -o -E '\w+' | tr '[A-Z]' '[a-z]' | sort | uniq -c | sort -nr