Answers:
使用GNU Awk:
gawk '
{ arr[$0]++ }
END {
PROCINFO["sorted_in"] = "@val_num_desc"
for (ln in arr) for (i = 1; i <= arr[ln]; i++) print ln
}
'
诀窍是使用数组和@val_num_desc
。每个遇到的行都成为一个索引,每次出现该行时,相关的值都会增加。最后,我们按特定顺序扫描整个数组:
"@val_num_desc"
[...]作为数字处理的元素值按从高到低的顺序排序。
所以外(第一)for
负责按所需顺序检索线路及其频率; 内部(第二个)for
只是打印当前拾取的行正确的次数。
注意:
awk
,除非你awk
是gawk
伪装的。在我的Debian awk
过去有限,我不得不安装gawk
。现在两个命令都理解这个,因为awk
(非直接)符号链接到gawk
。
以下将做你想要做的事情......虽然有许多其他方法可以实现这一点......例如gawk
,根据卡米尔的回答。
sort
将按行数据排序数据uniq -c
将计算匹配事件的数量(它们必须是邻居)sort -nr
将按相反的顺序按出现次数排序while
在每行循环迭代
read n l
将计数摄入n
,并将行数据导入l
for
循环将遍历n
倍echo "${l}"
输出行数据(
sort \
| uniq -c \
| sort -nr \
| while read n l; do \
for i in $(seq ${n}); do \
echo "${l}"; \
done; \
done
) <<"EOF"
a
b
b
b
b
c
c
d
d
d
EOF
PROCINFO["sorted_in"]
- 太棒了,正是我想要做的一个awk
例子,谢谢!