我有一个数据文件,如:
82 DEX26_28_h
82 DEX26_28_h
873 DEX34_h
89 DEX37_h
1 DEX34_h
我打算通过$ 2进行排序,以便列中的每个项目(17个uniques)彼此相邻。然后我想用$ 1总结所有#'同时拴在$ 2
上述测试文件的理想结果:
164 DEX26_28_h
874 DEX34_h
89 DEX27_h
有意义吗?基本上需要总结每个样本($ 2)发生的序列总数($ 1)和uniq只保留总和$ 2。这样最终结果就变成了17行。
我应该只用$ 2中的17个标识来表示,然后用awk对它们求和?
你们有什么想法?
答案 0 :(得分:2)
您可以在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
:首先使用键arr
打印i
中的值,然后使用键i
本身打印。