如何在bash中这样排序?
输入:
1
2
3
1
1
2
输出:
1
1
1
2
2
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)
使用sort
和awk
的另一种方法
sort file | awk 'p&&p!=$1{print FS}{p=$1}1'