李雷廷的个人博客分享 http://blog.sciencenet.cn/u/llt001

博文

使用datamash注意要对数据先排序

已有 2984 次阅读 2015-7-27 14:27 |系统分类:科研笔记

[使用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必须足够快地应对任意大小的输入数据。



https://blog.sciencenet.cn/blog-656335-908652.html

上一篇:一款强大的MacBook改键软件Karabiner
下一篇:needle和needleall
收藏 IP: 218.2.227.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-24 21:46

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部