Linux 快速构造大数据文件

news2024/11/16 5:44:20

        

文章目录如下

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=1
    while (i > 0){
        print i","str
        i++
    }
}' |head -c 1G

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

awk -v 'str=a,b,c' '
BEGIN{
    i=1
    while (i > 0){
        print i","str
        i++
    }
}' |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.coloradmin.cn/o/1404069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【剑指offer】重建二叉树

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述1、题目2、示例 二、题目分析1、递归2、栈 一、题目描述 1、题目 剑指offer&#xff1a;重建二叉树 给定节…

opencv#27模板匹配

图像模板匹配原理 例如给定一张图片&#xff0c;如上图大矩阵所示&#xff0c;然后给定一张模板图像&#xff0c;如上图小矩阵。 我们在大图像中去搜索与小图像中相同的部分或者是最为相似的内容。比如我们在图像中以灰色区域给出一个与模板图像尺寸大小一致的区域&#xff0c;…

LeetCode 48 旋转图像

题目描述 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4…

Java-泛型与通配符

泛型基础 泛型示例 泛型的作用 泛型的语法 注意事项 1.泛型只能用引用类型实例化而非基本类型 自定义泛型 自定义泛型类 2中数组不能初始化是因为不知道要开辟多大的空间 3 类加载是会加载静态方法 此时泛型的具体类型并没有被确定 因为对象没有被 声明或实例化 自定义泛…

linux的安装配置

文章目录 1.centos7安装2.如何进行一个网络的开启3.客户端Xshell和Xftp的一个使用4.换源 1.centos7安装 1.我是在虚拟机里面重装了一个liunx系统,首先我们新建一个虚拟机 2.前面东西都不需要我们进行一个选择&#xff0c;到图中的这一步我们选择一个liunx,版本的话我们选择一个…

读AI3.0笔记04_视觉识别

1. 两次飞跃 1.1. ConvNets是当今计算机视觉领域深度学习革命的驱动力 1.1.1. 20世纪80年代便由法国计算机科学家杨立昆提出&#xff0c;而他则是受到了福岛邦彦提出的神经认知机&#xff08;Neocognitron&#xff09;的启发 1.2. ImageNet竞赛被看作计算机视觉和人工智能进…

zero w配置C++ opencv csi 摄像头

经过一天半的摸索&#xff0c;踩过了很多坑&#xff0c;这里记录一下 1、系统网站&#xff1a;https://www.raspberrypi.org/downloads/raspberry-pi-os/ 由于zero w 性能不太行&#xff0c;我下载的是&#xff1a; 2、系统烧录&#xff1a; 这里的坑有两个&#xff0c;一个…

【深度学习】BasicSR训练过程记录,如何使用BasicSR训练GAN

文章目录 两种灵活的使用场景项目结构概览简化的使用方式 项目结构解读1. 代码的入口和训练的准备工作2. data和model的创建2.1 dataloader创建2.2 model的创建 3. 训练过程 动态实例化的历史演进1. If-else判断2. 动态实例化3. REGISTER注册机制 REGISTER注册机制的实现1. DAT…

React Router v6 改变页面Title

先说正事再闲聊 1、在路由表加个title字段 2、在index包裹路由 3、在App设置title 闲聊&#xff1a; 看到小黄波浪线了没 就是说默认不支持title字段了 出来的提示&#xff0c; 所以我本来是像下面这样搞的&#xff0c;就是感觉有点难维护&#xff0c;就还是用上面的方法了 …

Labview for循环精讲

本文详细介绍Labview中For循环的使用方法&#xff0c;从所有细节让你透彻的看明白For循环是如何使用的&#xff0c;如果有帮助的话记得点赞加关注~ 1. For循环结构 从最简单的地方讲起&#xff0c;一个常用的for循环结构是由for循环结构框图、循环次数、循环计数(i)三部分组成…

人大金仓数据库授权文件过期解决

一台用于测试的人大金仓数据库访问失败。 登录后发现服务停了。 使用命令行启动&#xff0c;提示服务过期。 查网上资料&#xff0c;说替换原有文件可以解决。 于是去官网下载一个新的&#xff0c;替换掉原来的授权文件。 再次启动数据库&#xff0c;还是提示授权文件过期。…

代码中遇到的问题

编译器错误消息&#xff1a; CS1061&#xff1a; default_aspx 不包含 GridView1_SelectedIndexChanged 的定义&#xff0c;并且找不到接受类型为default_aspx的第一个参数的可访问扩展方法GridView1_SelectedIndexChanged&#xff08;是否缺少 using 指令或程序集引用&#xf…

设计模式—行为型模式之备忘录模式

设计模式—行为型模式之备忘录模式 备忘录&#xff08;Memento&#xff09;模式&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模…

C++ //练习 2.35 判断下列定义推断出的类型是什么,然后编写程序进行验证。

C Primer&#xff08;第5版&#xff09; 练习 2.35 练习 2.35 判断下列定义推断出的类型是什么&#xff0c;然后编写程序进行验证。 const int i 42; auto j i; const auto &k i; auto *p &i; const auto j2 i, &k2 i;环境&#xff1a;Linux Ubuntu&#x…

ThreeJS快速入门指南

Three.js 介绍 Three.js 是一个开源的应用级 3D JavaScript 库&#xff0c;可以让开发者在网页上创建 3D 体验。Three.js 屏蔽了 WebGL的底层调用细节&#xff0c;让开发者能更快速的进行3D场景效果的开发。 Three.js的开发环境搭建 创建目录并使用 npm init -y 初始化 pack…

Laravel 10.x 里如何使用ffmpeg

原理上很简单&#xff0c;就是使用命令行去调用ffmpeg&#xff0c;然后分析一下输出是不是有错误。 安装 首先安装 symfony/process&#xff0c;主要用于包装一下&#xff0c;用来代替 exec, passthru, shell_exec and system 。 composer require symfony/process composer…

像素图片在网页中很模糊怎么办?输入这个样式

像素图片在网页中很模糊怎么办&#xff1f;输入这个样式 image-rendering: pixelated;输入前 输入后

java数据结构与算法刷题-----LeetCode378. 有序矩阵中第 K 小的元素

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 已知矩阵相对有序&#xff0c;可以用二分搜索&#xff0c;不过和…

Ultraleap 3Di配置以及在 Unity 中使用 Ultraleap 3Di手部跟踪

0 开发需求 1、硬件&#xff1a;Ultraleap 手部追踪相机&#xff08;Ultraleap 3Di&#xff09; 2、软件&#xff1a;在计算机上安装Ultraleap Gemini (V5.2) 手部跟踪软件。 3、版本&#xff1a;Unity 2021 LTS 或更高版本 4、Unity XR插件管理&#xff1a;可从软件包管理器窗…

Pyside6在Pycharm下安装和使用

目录 一&#xff1a;安装 二&#xff1a;使用 一&#xff1a;安装 打开Pycharm编辑器&#xff0c;file-setting里Python解释器&#xff0c;点击小号&#xff0c;添加模块&#xff0c;搜索Pyside6,安装 安装报错&#xff0c;可能是默认的库安装超时&#xff0c;用其他的源 p…