按单词出现次数对 bash 中的列进行排序

Sorting a column in bash by amount of occurances of words

所以我输出的文本在一列中有一个 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 命令也不支持此功能。

如有任何帮助,我们将不胜感激

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

awk 'NR==FNR{++freq[]; next} {print freq[] "\t" [=10=]}' 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 命令从最终输出中删除第一列

使用 single GNU awk 方法:

awk 'BEGIN{ PROCINFO["sorted_in"]="@val_num_desc" }
     { a[]++; b[][++c]= }
     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