给定键值内容,如何按键值分组并按值排序?

给定键值内容,如何按键值分组并按值排序?

我有以下示例输入格式(文件或标准输入):

key1: 1
key2: 2
key3: 3
key1: 4
key2: 5
key3: 6

是否有一些代码可以根据键对值进行分组然后进行排序?

预期输出将是以下任一表:

key1 key2 key3
1    2    3
4    5    6

之后可以按列进行排序(例如sort -k2)。类似于此例子

或者类似的格式,例如:

key1: 1 4
key2: 2 5
key3: 3 6

实现这一转变最简单的方法是什么?

答案1

这似乎是 的工作awk。它以某种方式允许使用关联多维数组。
以下 bash 脚本应该可以完成这项工作。

awk ' { Nb[$1]++;b[$1][Nb[$1]]=$2 }       
      END{ for (i in Nb) {                
        printf("%s ", i);               
        for (j = 1 ; j<=Nb[i]; j++) printf("%ld ", b[i][j]);
       printf(" \n") ; }   
      }' aaa.txt  | sort

一些说明:

  • 在第一部分中,{...}它扫描所有外部文件aaa.txt并加载数组b[][]和每个键的出现次数Nb[](也许您有 4 个 key3 实例和 12 个 key1 实例...)。

  • END{...}在找到的每个键的部分中for (i in Nb)打印没有的键新队printf(...))然后对于索引为 1..Nb[i] 的每个条目,它将打印该值。最后打印一个换行符。

  • 最后一个管道|将对输出进行排序

    key1: 1 4  
    key2: 2 5  
    key3: 3 6
    
  • 当然,如果需要不同的布局,可以从上面的示例开始构建它们并改变 for 循环的嵌套顺序。

答案2

当键列表固定时,可以通过以下命令进行转置:

$ pr -mt <(grep key1 in.txt | cut -f2 -d:) <(grep key2 in.txt | cut -f2 -d:) <(grep key3 in.txt | cut -f2 -d:) | sort -k1
1            2           3
4            5           6

可以进一步改进,使其更加灵活,方法是使用评估

相关内容