|
[使用datamash时经常会忘记对数据先排序而导致结果出错,应该先用sort命令对数据排序,或用-s选项做排序]
datamash是GNU项目下的一个软件,主要功能是在命令行下作一些数字、文本或统计运算,参见我之前的一篇博文(GNU datamash:http://blog.sciencenet.cn/blog-656335-838004.html )。在实际使用过程中,我经常会在产生数据后,通过管道直接连接datamash,比如对于两列数据,以第一列为分组,统计第二列元素出现的个数,从直觉上写命令如下:
cat input.txt | datamash -g 1 count 2
多数情况下,这样写命令得出的结果是错误的,因为你的数据数据很可能是乱序排列的。除非已经做过排序预处理,否则,正确的写法应该是:
cat input.txt | sort | datamash -g 1 count 2
或
cat input.txt | datamash -s -g 1 count 2
前者是利用sort命令对数据排序,后者相当于用sort命令做排序,但是用一种简化的形式 -s 。
这里我就想:为什么datamash在设计的时候不预检查数据是否排序过呢?或者为什么不默认需要对数据做排序呢?或者设计为数据处理与顺序无关呢?
假如让我来写一个与datamash的功能一样的程序,这样会有什么后果呢?
1. 预检查数据是否排序过需要耗费很多计算能力,尤其对于数据非常大的情况,从头到尾读一遍都会费好长时间;
2. 排序本身是一件非常耗费计算时间的事情,需要尽量避免重复做排序工作;
3. 假如数据处理与顺序无关,那么统计结果需要全部存储在内存中,直到把数据从头到尾读完,不利于程序的运行速度。
考虑这些因素的话,推测datamash的设计初衷可能是:1)假设用户完全了解自己的数据状态;2)假设用户完全理解datamash的工作原理;3)datamash必须足够快地应对任意大小的输入数据。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-19 22:11
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社