如何统计Vim中重复行的重复次数?
How to count the duplicate times of duplicate lines in Vim?
现在我正在使用 Gvim Windows。我想要一种不使用操作系统外部命令的纯Vim方式,来统计Vim中重复行的重复次数。
换句话说,我想要一种纯粹的 Vim 方式,如“:!sort % | uniq -c”。
没有现成的等效项。下面是一个快速而粗略的近似值。
正在做:
:echo getline(1,'$')->map({ idx, val -> getline(1,'$')->count(val) .. ' ' .. val })->sort()->uniq()->join("\n")
在此缓冲区上:
foo
foo
bar
baz
回应:
1 bar
1 baz
2 foo
在命令行中,这应该是一个很好的起点。
细分:
:echo {expr}
在命令行中回显 {expr}
的输出。
getline(1,'$')
returns 包含缓冲区中每一行的列表。
->map({ idx, val -> getline(1,'$')->count(val) .. ' ' .. val })
在列表中的每一项前面加上它在列表中的计数。
->sort()
对列表进行排序。
->uniq()
从列表中删除重复项。
->join("\n")
最后用换行符作为分隔符加入它,以便在回显到命令行时看起来不错。
虽然 romainl 的实现完全正确,但使用 dictionary 来计算出现次数可能具有更好的时间复杂度。
:let dict={}
:g/$/let ln=getline(".") | if !has_key(dict, ln) | let dict[ln]=0 | endif | let dict[ln]+=1
:for [k, v] in items(dict) | echo v." ".k | endfor
现在我正在使用 Gvim Windows。我想要一种不使用操作系统外部命令的纯Vim方式,来统计Vim中重复行的重复次数。 换句话说,我想要一种纯粹的 Vim 方式,如“:!sort % | uniq -c”。
没有现成的等效项。下面是一个快速而粗略的近似值。
正在做:
:echo getline(1,'$')->map({ idx, val -> getline(1,'$')->count(val) .. ' ' .. val })->sort()->uniq()->join("\n")
在此缓冲区上:
foo
foo
bar
baz
回应:
1 bar
1 baz
2 foo
在命令行中,这应该是一个很好的起点。
细分:
:echo {expr}
在命令行中回显 {expr}
的输出。
getline(1,'$')
returns 包含缓冲区中每一行的列表。
->map({ idx, val -> getline(1,'$')->count(val) .. ' ' .. val })
在列表中的每一项前面加上它在列表中的计数。
->sort()
对列表进行排序。
->uniq()
从列表中删除重复项。
->join("\n")
最后用换行符作为分隔符加入它,以便在回显到命令行时看起来不错。
虽然 romainl 的实现完全正确,但使用 dictionary 来计算出现次数可能具有更好的时间复杂度。
:let dict={}
:g/$/let ln=getline(".") | if !has_key(dict, ln) | let dict[ln]=0 | endif | let dict[ln]+=1
:for [k, v] in items(dict) | echo v." ".k | endfor