Linux 快速构造大数据文件

        

文章目录如下

1. 如何生成数据文件

2. 使用 yes 命令构造数据

2.1. 基本用法

2.2. 构造数据文件

3. 使用 awk 命令构造数据

3.1. 基本用法

3.2. awk 循环输出

3.3. awk 指定分隔符

3.4. awk 随机数

3.5. awk 随机字符

3.6. awk 构造数据

4. 总结


        

1. 如何生成数据文件

在Linux中,我们有很多生成数据文件的方式,比如

echo "a,b,c" > file.txt

这种方式最为简单直接,缺点也相对明显,例如:生成多行数据非常繁琐

echo "a,b,c
a,b,c
a,b,c" > file.txt

大部分需求是需要上万行数据,显然单纯的使用 echo 的不明智的,一般情况下需要在 echo 的基础上增加循环的方式

for i in {1..10000};do  # 循环1w次echo "a,b,c" >> file.txt
done

使用循环可以将每行都修改为不同的数据,这对于构造一些特定场景的数据有着极大帮助,比如

for i in {1..10};do    # 循环10次str=$(echo $RANDOM |md5sum |head -c 10)  # 随机字符echo "${i},${str}"
done

        

使用 for 循环可以按照特定场景构造数据,但仍然存在一个缺点:效率低下。当然,也有的伙伴会认为:既然 for 循环太慢,那就使用 dd 构造数据吧。

截图上可以看到 dd 构造数据的速度确实快,但它所构造的是二进制数据。对我们来说,这样的文件在大部分情况是用不上的,所以这篇文章主要介绍两个用于快速构造数据的命令:yes、awk。

        

2. 使用 yes 命令构造数据

2.1. 基本用法

yes 命令通常用于在终端中重复输出指定的字符串,或者以默认值不断地向命令行发送“y”字符串,通常用于自动化脚本或者在需要自动确认输入的情况下。

直接执行 yes 的结果如下:

无限打印 y,通过 Ctrl + C 停止

        

yes 命令也支持指定输出固定的字符

        

2.2. 构造数据文件

由于 yes 的作用是无限重复打印指定字符串,这也意味着它无法修改字符串中的字符,仅适用于对数据没有特定需求的构造方式。

【案例一】构造10w行数据

yes "a,b,c,d,e" |head -100000

        

【案例二】构造1GB数据

yes "a,b,c,d,e" |head -c 1G

由于 head 是按大小截断字符,所以导致最后一行可能与其他行并不一致。

利用 sed 不输出最后1行

yes "a,b,c,d,e" |head -c 1G |sed -n '$!p'

        

3. 使用 awk 命令构造数据

3.1. 基本用法

awk 命令本身是用于提取、转换和格式化文本数据,但由于是使用高效的C语言实现,使得 awk 成为快速高效的文本处理工具。所以生成数据的效率是非常的高,这篇主要介绍如何生成数据,awk 的文本处理见另一篇文章:https://blog.csdn.net/m0_61066945/article/details/132557457

生成指定数据的语法如下:

awk 'BEGIN{print "a,b,c,d"}'

  • BEGIN:表示在开始处理之前执行的操作,也就是说不需要指定某个文件。
  • print:打印某个字符串
  • "a,b,c,d":需要输出的字符串

        

3.2. awk 循环输出

awk 同样支持 for 循环或 while 循环,语法如下

awk 'BEGIN{for(i=1; i<=10; i++){print "a,b,c,d"}
}'

        

使用循环也就可以使用变量

awk 'BEGIN{for(i=1; i<=10; i++){print i, "a,b,c,d"}
}'

        

3.3. awk 指定分隔符

awk 通过 OFS 来指定分隔符

awk 'BEGIN{OFS="、"; print "A", "OO", 123}'

        

将方法带入循环中

awk 'BEGIN{OFS="、"for(i=1; i<=10; i++){print i, "a,b,c,d"}
}'

        

3.4. awk 随机数

awk 通过 srand() 来生成随机数(范围:0~1)

awk 'BEGIN{srand(); print rand()}'

        

取整,设定范围0~100

awk 'BEGIN{srand(); print int(rand() * 100)}'

        

将方法带入循环中

awk 'BEGIN{srand()for(i=1; i<=10; i++){print rand()*100, "a,b,c,d"}
}'awk 'BEGIN{srand(); for(i=1; i<=10; i++){print rand()*100, "a,b,c,d"}}'

        

3.5. awk 随机字符

awk 内置函数中没有随机字符串,所以通过随机数转换为ASCII码对应的字母

awk 'BEGIN{srand()for(i=1;i<=10;i++){printf "%c\n", 97+int(rand()*26)}
}'

        

由于每次只能打印1个字符,这也就意味着打印单行n个字符,需要循环n次。

awk 'BEGIN { srand(); for (i = 1; i <= 10; i++) {str = "";for (j = 1; j <= 6; j++) {str = str sprintf("%c", 97+int(rand()*26));}print str;}
}'

        

换一种方式输出,不需要循环多次

awk -v 'row=10' -v 'let=5' -v 'str=qwertyuiopasdfghjklzxcvbnm' 'BEGIN{srand()for (i=1; i<=row; i++){rand_num = int(rand()*25+1)print substr(str, rand_num, let)}
}'

        

来对比一下两种方式的效率(输出100w行数据)

第1种方式在输出随机字符串长度时增加了循环的次数,所以第2种方式效率远高于第1种。

        

3.6. awk 构造数据

【案例一】构造10w行数据

awk -v "str=a,b,c,d" '
BEGIN{OFS=","for(i=1; i<=100000; i++){print i, str}
}'

        

【案例二】构造1GB数据

awk -v 'str=a,b,c' '
BEGIN{i=1while (i > 0){print i","stri++}
}' |head -c 1G

最后1行不完整,同样可以使用sed来处理

awk -v 'str=a,b,c' '
BEGIN{i=1while (i > 0){print i","stri++}
}' |head -c 1G |sed -n '$!p'

        

【案例三】构造复杂数据

  1. 生成10w行数据
  2. 第1列为1~100000
  3. 第2列为5个随机字符
  4. 第3列为18~45的整数
  5. 第4列为男或女
  6. 第5列为日期
awk -v 'row=100000' '
BEGIN{OFS = ","srand()str = "qwertyuiopasdfghjklzxcvbnm"for (i=1; i<=row; i++){rand_num = int(rand()*25+1)s_5 = substr(str, rand_num, 5)rand_int = int(18 + rand() * (45 - 18 + 1))gender = int(rand() * 2) ? "男" : "女"date = strftime("%Y-%m-%d", systime())print i, s_5, rand_int, gender, date}
}'

        

4. 总结

先看一下 shell 循环、dd、yes、awk 等命令的效率:

1、shell 循环生成100MB 数据(51.561秒)


2、awk 生成 100MB 数据(1.1秒)

3、yes 生成 100MB 数据(0.313秒)

 4、dd 生成 100MB 数据(0.123秒)

        

构造数据方法100MB 耗时字符串类型
shell 循环51.561 秒自定义各种类型
awk 命令1.100 秒自定义各种类型
yes 命令0.313 秒只能固定字符
dd 命令0.123 秒二进制类型

  • 从效率来看,最快的方法是 dd,其次 yes、awk,shell 相比于前几种方法效率太低。
  • 从能力上看,shell和awk都支持自定义字符,而yes仅支持固定字符,dd仅支持二进制字符。

        

总结

  • 如果仅需要一个大文件,dd 效率最高。
  • 如果需要一个固定字符的文件,yes 效率最高。
  • 如果需要各种不同类型的字符,awk 最为合适。
  • shell 效率太低,不建议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/423471.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源项目CuteSqlite开发笔记(八):Windows 64位/32位使用GetWindowLongPtr钩子函数

需求描述 在开发CuteSqlite的时候&#xff0c; 有一个功能需要实现&#xff0c;鼠标移到WTL::CStatic上后&#xff0c;发送消息通知CToolTipCtrl弹出。 遇到问题 WTL::CStatic控件没有相应 WM_MOUSEMOVE 消息&#xff0c;需要返回一个HTCLIENT消息来让窗口处理函数执行 WM_MO…

Databend 开源周报第 129 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持标准流 标…

智慧工厂视频监控平台EasyCVR公网收流后内网设备无法播放是什么原因?

安防视频监控平台EasyCVR采用了开放式的网络结构&#xff0c;支持高清视频的接入和传输、分发&#xff0c;平台提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;此外&am…

如何在WordPress网站中添加多语言搜索(2种简单方法)

您想在WordPress网站中添加多语言搜索吗&#xff1f; 如果您有一个多语言 WordPress 网站&#xff0c;那么添加多语言搜索功能可以帮助用户通过使用自己的语言进行搜索来更快地找到信息。 在本文中&#xff0c;我们将向您展示如何在 WordPress 中轻松添加多语言搜索&#xff…

云风网(www.niech.cn)个人网站搭建(四)navicat 连接mongodb数据库

navicat安装破解 第一步&#xff0c;启动MongoDB服务 具体操作请移步&#xff1a;MongoDB安装配置教程 第二步&#xff1a;创建新连接&#xff0c;创建数据库 文件–新建连接–MongoDB 双击打开连接&#xff08;也可右键打开连接&#xff09;&#xff0c;右键新建数据库&…

《移动通信原理与应用》实验一——QPSK调制与解调实验(实验箱)

目录 一、实验目的 二、实验主要内容及原理 2.1、主要内容 2.2、基本原理 三、实验器材 3.1、移动通信原理实验箱&#xff1a; 3.2、实验框图及电路说明 四、实验步骤 五、实验过程原始记录(数据、图表、计算等) 六、实验结果及分析 1、结果分析&#xff1a; 2、思…

【Java IO】设计模式 (装饰者模式)

Java I/O 使用了装饰者模式来实现。 装饰者模式 请参考装饰者模式详解 装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component)&#xff0c;具体组件的方法实现不需要依赖于其它对象&#xff0c;而装饰者组合了一个组件&#xff0c;这样它可以装饰其它装饰者…

如何通过系统命令排查账号安全?

如何通过系统命令排查账号安全 query user 查看当前登录账号 logoff id 注销用户id net user 查看用户 net user username 查看用户登录情况 lusrmgr.msc 查看隐藏账号 winR打开regedit注册表 找到计算机\HEKY_LOCAL_MACHINE\SAM\SAM\右键给与用户读写权限 刷新打开 HKEY…

工业搅拌机内流场仿真APP

工业用搅拌机主要是用于搅拌水泥、沙石、各类干粉砂浆等建筑材料。工业搅拌机内流场仿真APP展示的是针对双级折叶涡轮搅拌器&#xff0c;应用多重参考系模型模拟搅拌罐内旋转流动的过程及结果。用户可根据输入参数界面修改桨叶的尺寸、数量&#xff0c;流体物性以及运行工况等条…

黑马axios案例之地区查询

查询某个省内某个城市的所有地区 接口&#xff1a;http://hmajax.itheima.net/api/area 参数名: pname:省份名字或直辖市名字&#xff0c;比如北京、福建省、辽宁省… cname:城市名字&#xff0c;比如北京市、厦门市、大连市… <!DOCTYPE html> <html lang"en&q…

transdata笔记:手机数据处理

1 mobile_stay_duration 每个停留点白天和夜间的持续时间 transbigdata.mobile_stay_duration(staydata, col[stime, etime], start_hour8, end_hour20) 1.1 主要参数 staydata停留数据&#xff08;每一行是一条数据&#xff09;col 列名&#xff0c;顺序为[‘starttime’,…

仓储管理系统——软件工程报告(总体设计)③

总体设计 一、需求规定 软件工程仓库存储管理系统的需求规定是确保系统能够满足用户期望、提高工作效率、确保数据安全性和系统可维护性的基石。其涵盖了功能性、性能、数据管理、用户界面和系统可维护性等多个方面。通过严格的验收标准&#xff0c;可以确保系统在实际应用中…