在bash中按单词出现量对列进行排序
所以我有一个正在输出的文本,在一列中有一个ip地址,在另一列中有一个http状态代码。我不想按事件的数量对本栏进行排序,以便在bash中按单词出现量对列进行排序,bash,sorting,awk,cut,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来计算发生次
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[$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
命令从最终输出中删除第一列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
我喜欢施瓦茨变换