我试图对cygwin中某些辅音群的频率进行排序。
首先使用的命令是:
tr 'a-zöäü' 'A-ZÖÄÜ' < text.txt | tr -sc 'BCDFGHJKLMNPQRSTVWXYZ' '\n' |
sort | uniq -c | sort -nr
我认为它的作用:
将所有低级转换为大写,消除与第一个正则表达式不匹配的所有内容,并在每个字符串后打印一个新行。
它给了我一个这样的清单:300 N
181 R
157 D
116 S
91 T
82 G
81 M
69 B
65 ND
这已经相当不错了,但我只对两个以上字母的集群感兴趣(所以第一场对我来说很有趣的比赛就是'ND')。现在我试图用少于两个字母来强化每个字符串。
我尝试了什么: tr 'a-zöäü' 'A-ZÖÄÜ' < text.txt | tr -sc [BCDFGHJKLMNPQRSTVWXYZ]{2} '\n' |
sort | uniq -c | sort -nr
因为我认为添加{2}
会匹配任何辅音组合,并拒绝单个字母颠倒我的列表(N
,R
,D
..) - 但实际上并没有改变任何东西,列表保持不变。
任何人都可以帮助我吗?
谢谢。
答案 0 :(得分:0)
您可以使用grep:
进行后期处理... | grep -E '[[:digit:]]+ [[:alnum:]]{2,}$'
这只会显示以两个或多个字符及其前面的数字结尾的行。
答案 1 :(得分:0)
使用一点Perl可以相当简单:
perl -ne '$_ = join("", <>); print map("$_\n", m/[[:alnum:]]{2,}/g)' < text.txt | \
sort | uniq -c | sort -nr
让Perl进行计数和排序也会更有效:
perl -ne '$_ = join("", <>); for (m/[[:alnum:]]{2,}/g) { $m{$_}++ } END { print map("$m{$_}: $_\n", sort { $m{$a} <=> $m{$b} } keys %m) }' < text.txt
这个单行Perl脚本扩展并评论:
# match and iterate over alphabetic sequences of length >= 2
for (m/[[:alnum:]]{2,}/g) {
# increment the count of the current item, building a map of counts
$m{$_}++
}
END {
# print the map as COUNT: ITEM, sorted by counted, descending
print map("$m{$_}: $_\n", sort { $m{$a} <=> $m{$b} } keys %m)
}