按bash中列的出现次数排序

时间:2017-08-31 19:50:15

标签: bash sorting awk cut

所以我输出的文本在一列中有一个ip地址,在另一列中有一个http状态代码。我不想按出现次数对这一栏进行排序,以便

x.x 1
x.x 2
x.y 1
x.z 3
y.x 4
x.x 5
x.x 4
x.x 4

看起来像

y.x 4
x.x 4
x.x 4
x.x 1
x.y 1
x.x 5
x.z 3
x.x 2

这是第二列状态代码,ip地址不需要按任何特定顺序排序

因为4是最常见的,所以它应该是第一个,然后是1,依此类推。

然而,我所能找到的只是如何使用uniq来计算出现次数,从而删除重复项并为每行添加一个数字前缀。

就我所知,常规sort命令不支持此功能。

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:2)

使用 GNU awk 方法:

awk 'BEGIN{ PROCINFO["sorted_in"]="@val_num_desc" }
     { a[$2]++; b[$2][++c]=$1 }
     END{ for(i in a) for(j in b[i]) print b[i][j],i }' file
  • PROCINFO["sorted_in"]="@val_num_desc" - 数组元素的比较,其中"@val_num_desc"确保将元素值视为数字,从高到低排序

输出:

y.x 4
x.x 4
x.x 4
x.y 1
x.x 1
x.x 2
x.z 3
x.x 5

答案 1 :(得分:1)

您可以使用此awk + sort + cut组合:

awk 'NR==FNR{++freq[$2]; next} {print freq[$2] "\t" $0}' file{,} | sort -k1nr | cut -f 2-
x.x 4
x.x 4
y.x 4
x.x 1
x.y 1
x.x 2
x.x 5
x.z 3

<强>详细信息:

  1. awk命令计算第二个字段的频率并将其添加到记录前
  2. sort命令对频率字段进行反向数字排序
  3. cut命令从最终输出中删除第一列