使用awk和grep进行数据抽样比较

6 篇文章 0 订阅
6 篇文章 0 订阅

在进行数据抽样时,我们关注所抽取的数据在整体数据中分布的均匀性。

最简单的就是均匀抽取,即每隔几行选取一行。

比如,数据文件较大时,每隔10行或者每隔100行进行抽取。

 

假如数据文件还是“msg”

我们每隔10行取一行,有两种方法:

 

方法1:nl+grep

 

nl msg | grep -P '1\t' > target_file

 

方法2:awk

 

awk '{if(NR%10 ==1) print $0}' msg > target_file

 

两种方法都可以满足我们提出的需求。

但经过比较后发现,方法2效率略高于方法1,msg数据量:23380092

耗时分别为:13s、12s. (当然取决于具体的硬件)

 

而在前文中,我们统计包含某字符串的行数时,grep的效率要远远高于awk。

不难发现,是nl导致了效率的低下。nl把所有的记录都输出了一遍,效率和awk持平,而grep耗时1s左右(和上文中测试结果一致)。

 

因此在需要将文件内容都output一遍的场景下,优先选择awk方式。

 

而且,awk还有另一个好处,在面对每隔2行、3行...n行取一行的需求,实现起来更方便。

 

而nl+grep就比较纠结了,例如实现每隔一行取一行的需求:

 

nl+grep:

 

nl msg | grep -P '2\t|4\t|6\t|8\t|0\t'   > target_file

 

awk:

 

awk '{if(NR%2 ==0) print $0}' msg > target_file
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值