如何用Raku实现类似GNU uniq -c的重复行数统计功能?
Raku 实现类似 GNU uniq -c 的功能
直接统计所有重复行(不要求行连续)
如果不需要像 bash 中那样先排序、只统计连续重复行,而是直接统计所有行的出现次数,Raku 的Bag集合可以完美实现这个需求——它专门用于元素计数。
比如处理你的输入:
one two one three one two four five
可以用以下代码:
# 从标准输入读取行,统计次数后输出 for $*IN.lines.Bag.kv -> $line, $count { say "$line $count" }
执行后输出:
one two 2 one three 1 four five 1
模拟 GNU uniq -c 默认行为(统计连续重复行)
如果你需要和 bash 中sort | uniq -c的行为一致——先排序让重复行连续,再统计连续重复的次数,可以分两步处理:
- 先对输入行排序
- 统计连续重复的行
对应的 Raku 代码:
my @sorted-lines = $*IN.lines.sort; return unless @sorted-lines; my ($current-line, $count) = @sorted-lines[0], 1; for @sorted-lines[1..*] -> $line { if $line eq $current-line { $count++ } else { say "$current-line $count"; ($current-line, $count) = $line, 1; } } say "$current-line $count";
关于你提到的unique和squish方法
unique:用于获取所有不重复的元素,默认会打乱顺序,也可以通过:preserve参数保留首次出现的顺序,但它本身不提供计数功能。squish:只会移除连续的重复元素,同样不附带计数,适合快速去重连续重复行,但要统计次数还需要额外逻辑。
内容的提问来源于stack exchange,提问作者Richard Hainsworth
相关产品推荐
相关产品推荐

