所以我输出的文本在一列中有一个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
命令不支持此功能。
任何帮助将不胜感激
答案 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
<强>详细信息:强>
awk
命令计算第二个字段的频率并将其添加到记录前sort
命令对频率字段进行反向数字排序cut
命令从最终输出中删除第一列