Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中按单词出现量对列进行排序_Bash_Sorting_Awk_Cut - Fatal编程技术网

在bash中按单词出现量对列进行排序

在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来计算发生次

所以我有一个正在输出的文本,在一列中有一个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[$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
    命令从最终输出中删除第一列
  • 使用单个GNUawk方法:

    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
    

    我喜欢施瓦茨变换