我有以下示例输入格式(文件或标准输入):
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
可以进一步改进,使其更加灵活,方法是使用评估。