2

我有一个数据文件,例如:

82 DEX26_28_h
82 DEX26_28_h
873 DEX34_h
89 DEX37_h
1 DEX34_h

我打算通过 $2 进行排序,以便列中的每个项目(17 个唯一项)彼此相邻。然后我想在 1 美元中总结所有#,同时拴在 2 美元上

上述测试文件的理想结果:

164 DEX26_28_h
874 DEX34_h
89 DEX27_h

有道理?基本上需要总结每个样本($2)发生的序列总数($1),并且 uniq 在保持总和的同时只需要 $2。这样最终的结果就变成了 17 行。

我是否应该通过 $2 中的 17 个标识中的每一个来查找,然后使用 awk 对它们求和?

你们有什么感想?

4

1 回答 1

2

您可以在 awk 中使用数组进行求和:

awk '{arr[$2]+=$1} END {for (i in arr) {print arr[i],i}}'

然后,您可以通过管道对其进行排序。


这是做什么的:

  • arr[$2]+=$1: 将 的值添加到具有索引 (key)$1的数组中的元素。(以前未定义的元素很方便地定义为 0,所以是的,您可以在这里做一个而不用担心键是否“存在”。)如果您不熟悉数组,这基本上是在内存中创建一个查找表基于你的领域。arr$2+=$2

  • END...:在处理结束时执行一次

  • for (i in arr):对于数组中的每个键arr,将该元素分配给i并运行以下块中的代码。

  • print arr[i],i:首先打印 key 中的值arri然后是 keyi本身。

于 2012-10-26T18:21:17.340 回答