在进行数据抽样时,我们关注所抽取的数据在整体数据中分布的均匀性。
最简单的就是均匀抽取,即每隔几行选取一行。
比如,数据文件较大时,每隔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