按组中bash中的出现次数排序

时间:2019-10-04 15:02:15

标签: linux bash shell unix

如何在bash中这样排序?

输入:

1
2
3
1
1
2

输出:

1
1
1

2
2

3

我要在组之间打印最多的出现次数,并在它们之间插入一个空白的新行。

3 个答案:

答案 0 :(得分:1)

processThatProducesInput | 
sort | 
uniq -c | 
sort -k1,1nr |
while read -r n data; do
    for ((i=1; i<=n; i++)); do 
        echo "$data"
    done
    echo
done

首先,我们对输入进行排序。这是一个词法排序,但是如果需要的话,它可以是数字,这仅对相同大小的组才有意义:您希望它们按什么顺序排列?
然后我们计算每个排序的组。
然后,我们按组的大小按降序排序。
然后,我们重新输出排序后的索引,并按要求显示空白行。

答案 1 :(得分:0)

仅使用GNU awk:

$ awk ' {
    c[$0]++                                 # count char frequencies
}
END {
    PROCINFO["sorted_in"]="@val_num_desc"   # starting with the biggest count
    for(i in c) {                           # for every char count
        printf "%s", (j==""?"":"\n")        # output empty line where needed
        for(j=1;j<=c[i];j++)                # count many times
            print i                         # ... print the char
    }
}' file

输出:

1
1
1

2
2

3

答案 2 :(得分:0)

使用sortawk的另一种方法

sort file | awk 'p&&p!=$1{print FS}{p=$1}1'