我有一个数据文件,例如:
82 DEX26_28_h
82 DEX26_28_h
873 DEX34_h
89 DEX37_h
1 DEX34_h
我打算通过 $2 进行排序,以便列中的每个项目(17 个唯一项)彼此相邻。然后我想总结 $1 中的所有 #,同时绑定(bind)到 $2
上面测试文件的理想结果:
164 DEX26_28_h
874 DEX34_h
89 DEX27_h
有道理吗?基本上需要对每个样本($2)发生的序列总数($1)求和,而 uniq 只需要 $2,同时保持总和。这样最终结果就变成了总共17行。
我是否应该只用 grep 找出 $2 中的 17 个标识,然后使用 awk 将它们求和?
大家觉得怎么样?
最佳答案
您可以在 awk 中使用数组来进行求和:
awk '{arr[$2]+=$1} END {for (i in arr) {print arr[i],i}}'
然后您可以通过管道对其进行排序。
它的作用:
arr[$2]+=$1
:将$1
的值添加到数组arr
中索引为 (键)$2
。 (以前未定义的元素很方便地定义为 0,所以是的,您可以在这里执行+=
,而不必担心键是否“存在”。)如果您不熟悉数组,这是基本上是根据您的$2
字段在内存中创建一个查找表。END...
:在处理结束时执行一次for (i in arr)
:对于数组arr
中的每个键,将该元素分配给i
并运行以下代码块中的代码。print arr[i],i
:首先打印带有键i
的arr
中的值,然后打印键>i
本身。
关于awk - 求和或排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13092263/