shell实现折线图

生成 100 行数据到文件 file.txt

for ((i=1; i<=100; i++));do
        if [ ${i} -lt 10 ];then
                num=$(( (RANDOM % 5) + 10 + i ))
        else
                num=$(( (RANDOM % 5) + 10 + 15 ))
        fi
        echo ${num}
done

通过文件 file.txt 生成折线图

#!/bin/bash

# 指定文件名,该文件必须为数字
file='./file.txt'
# 指定折线图的符号
symbol='@'
# 指定x轴最大长度
x_length=150
# 指定y轴高度
y_length=25

# 生成文件时需要的临时文件(不用配置)
tmp_file='./.tmp.txt'
new_file='./.new.txt'

# 读取文件行数,如果为0则退出,如果小于x轴长度则更新x轴长度,如果大于x轴长度则按比例只取指定的长度
file_rows=$(wc -l < ${file})
if [ ${file_rows} -eq 0 ];then
        echo -e "[ERROR] If the file is empty, exit !"
        exit 1
elif [ ${file_rows} -le ${x_length} ];then
        x_length=${file_rows}
else
        residue=$((file_rows / x_length))
        awk "NR % ${residue} == 0" ${file} > ${new_file}
        file=${new_file}
fi

# 获取最大值、最小值
max_number=$(awk 'NR==1 {max=$1} $1>max {max=$1} END{print max}' ${file})
min_number=$(awk 'NR==1 {min=$1} $1<min {min=$1} END {print min}' ${file})
# 获取最大行的字符数
max_char=$(awk 'NR==1 {max=length} length>max {max=length} END{print max}' ${file})
# 如果最大行的字符数为偶数,将第1列字符数+3,(为了避免对不齐的问题),+4是为了避免存在负数对不齐问题
[ $((max_char % 2)) -eq 0 ] && max_char=$((max_char + 3)) || max_char=$((max_char + 4))
x_symbol_length=$((x_length + max_char + 3))

# 输出第一行图表横线字符
perl -E "say '—' x ${x_symbol_length}" >${tmp_file}

# 输出第一行说明
title="scatter plot"
padding=$[(${x_length} - ${#title}) / 2]
printf "|%-${max_char}s|%-${padding}s%s%-${padding}s|\n" "unit" "" "${title}" "" >>${tmp_file}
perl -E "say '—' x ${x_symbol_length}" >>${tmp_file}

# 按指定文件的数字输出单位长度
num=${max_number}
scale=$(awk "BEGIN{print int( (${max_number} - ${min_number}) / ${y_length} + 1)}")
for ((i=1; i<=y_length; i++));do
        printf "|%-${max_char}s|\n" "${num}" >>${tmp_file}
        num=$(awk "BEGIN{print int(${num} - ${scale})}")
done

# 横向刻划散点图
x_length=$((x_length + 1))
for ((i=1; i<=x_length; i++));do
        num=${max_number}
        for ((j=1; j<=y_length; j++));do
                file_row=$((j+3))
                file_num=$(sed -n "${i}p" ${file} |awk "{print int(\$1 / ${num})}")
                if [[ ${i} == ${x_length} ]];then
                        sed_symbol='|'
                        result=0
                elif [[ ${file_num} == 1 ]];then
                        sed_symbol="${symbol}"
                        result=1
                else
                        sed_symbol=' '
                        result=0
                fi

                sed -i "${file_row}s/\$/${sed_symbol}/" ${tmp_file}

                if [[ ${result} == 1 ]];then
                        if [[ ${j} == ${y_length} ]];then
                                continue 2
                        else
                                sed_str="$((file_row+1)),$((y_length+3))"
                                sed -i "${sed_str}s/\$/ /" ${tmp_file}
                                continue 2
                        fi
                fi
                num=$(awk "BEGIN{print int(${num} - ${scale})}")
        done
done

# 输出最后一行图表横线字符
perl -E "say '—' x ${x_symbol_length}" >>${tmp_file}
cat ${tmp_file}

[ -f ${tmp_file} ] && rm -rf ${tmp_file}
[ -f ${new_file} ] && rm -rf ${new_file}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis最实用的基础入门数据结构和常用指令使用教程

1.单线程redis操作为什么那么快&#xff1f; 一方面&#xff0c;Redis 的大部分操作在内存上完成&#xff0c;再加上它采用了高效的数据结构&#xff0c;例如哈希表和跳表&#xff0c;这是它实现高性能的一个重要原因。另一方面&#xff0c;就是 Redis 采用了多路复用机制&…

patchless amsi学习(中)

DR7 DR7被称为“调试控制寄存器”&#xff0c;允许对每个硬件断点进行精细控制。其中&#xff0c;前8位控制是否启用了特定的硬件断点。偶数位&#xff08;0、2、4、6&#xff09;称为L0-L3&#xff0c;在本地启用了断点&#xff0c;这意味着仅在当前任务中检测到断点异常时才…

配置Nginx解决跨域问题

Nginx 中将前端请求中的所有以 “/apiUrl” 开头的路径代理到 http://192.12.200.101:9813 例如&#xff1a; /apiUrl/login > http://192.12.200.101:9813/login 配置nginx环境 进入Nginx 的配置文件编辑界面: sudo nano /etc/nginx/conf.d/default.conf开始编辑 defaul…

7.实现任务的rebalance

1.设计 1.1 背景 系统启动后&#xff0c;所有任务都在被执行&#xff0c;如果这时某个节点宕机&#xff0c;那它负责的任务就不能执行了&#xff0c;这对有稳定性要求的任务是不能接受的&#xff0c;所以系统要实现rebalance的功能。 1.2 设计 下面是Job分配与执行的业务点…

使用案例总结Vlookup函数的30种用法

1 基础用法 =VLOOKUP(A12,B$1:D$8,3,0) 2 批量查找 =VLOOKUP(A11:A13,A2:C8,3,0) 3 模糊查找 =VLOOKUP("*"&D2&"*",A:B,2,0) 4 模糊查找2 =VLOOKUP(D10&"??",A:B,2,0) 5 模糊查找3 =

HBuilder X将Vue打包APP返回上一页退出问题、清除缓存页面历史防止返回登录页(上一页)、以及状态栏颜色切换

目录 一、返回上一页退出问题 二、清除缓存页面历史防止返回上一页 三、状态栏颜色切换 一、返回上一页退出问题 1.首先重新认识一下vue的页面跳转&#xff0c;这里我只说常用到的两个 goSkip(){//直接跳转this.$router.push(/test);this.$router.replace(/test);//带参数跳…

计算机图形学头歌合集(题集附解)

目录 CG1-v1.0-点和直线的绘制 第1关&#xff1a;OpenGL点的绘制 第2关&#xff1a;OpenGL简单图形绘制 第3关&#xff1a;OpenGL直线绘制 第4关&#xff1a;0<1直线绘制-dda算法<> 第5关&#xff1a;0<1直线绘制-中点算法<> 第6关&#xff1a;一般直线绘…

Flink系列之:大状态与 Checkpoint 调优

Flink系列之&#xff1a;大状态与 Checkpoint 调优 一、概述二、监控状态和 Checkpoints三、Checkpoint 调优四、RocksDB 调优五、增量 Checkpoint六、RocksDB 或 JVM 堆中的计时器七、RocksDB 内存调优八、容量规划九、压缩十、Task 本地恢复十一、主要&#xff08;分布式存储…

云仓酒庄的品牌雷盛红酒LEESON分享香槟为什么是“酸”的?

云仓酒庄致力成为红酒爱好者的首选供应商。云仓酒庄品牌雷盛红酒多系列、多国家、多价位区间的多品种供货&#xff0c;使得酒品丰富而多样&#xff0c;既可以整箱方式销售&#xff0c;也可以单瓶模式购买&#xff0c;全管道使成本更低&#xff0c;降低中间仓储环节、支线物流仓…

codeforces A. Constructive Problems

分析 由图可得&#xff1a;一开始放一个&#xff0c;由于边上的无需依靠对角线 r e b u i l d rebuild rebuild &#xff0c;所以可以直接 r e b u i l d rebuild rebuild &#xff0c;这样一列就好了。然后第二列随便放一个位置&#xff0c;其他所有都可以靠对角线 r e b u…

12.18拓扑排序,DAG,模板,课程安排

拓扑排序 有向无环图一定是拓扑序列,有向有环图一定不是拓扑序列。 无向图没有拓扑序列。 首先我们先来解释一下什么是有向无环图&#xff1a; 有向就是我们两个结点之间的边是有方向的&#xff0c;无环的意思就是整个序列中没有几个结点通过边形成一个圆环。 下图就是一个…

实战Src对ruoyi框架管理系统漏洞的复现

前言&#xff1a; 在挖src的时候&#xff0c;搜搜有没有后台弱口令能进去的&#xff1a; 发现一个弱口令进去后&#xff1a; 【这个蓝色的草丛居然堪比算是ruoyi的指纹】 看这界面&#xff0c;是不是很像ruoyi 插件一看&#xff1a; 前端vue.js 加上登录的cookie rememberM…

Python-flask 入门代码

python与pycharm安装 过程略&#xff0c;网上很多&#xff0c;记得为pycharm配置默认解释器 虚拟环境 pipenv # 全局安装虚拟环境 # 可加-U参数&#xff0c;明确全局安装&#xff0c;不加好像也可以? pip3 install pipenv #检查安装情况 pipenv --version # ---控制台输出…

Spring Boot 3 + Vue 3 整合 WebSocket (STOMP协议) 实现广播和点对点实时消息

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

鸿蒙Js实战,计算器功能开发

场景&#xff1a; 通过动态设置按钮组件button实现计算器的键盘&#xff0c;通过文本text显示计算的表达书&#xff0c;可以计算&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;可以一个一个移除&#xff0c;可以重置 等。 下面我们开始今天的文章&#xff0c;还是老规…

AIGC(生成式AI)试用 15 -- 小结

断断续续的尝试在实际的工作使用中理解和测试AIGC&#xff0c;运用会越来越多、越来越广范&#xff0c;但也是时候做个小结了。 没有太用热火的ChatGPT&#xff0c;只是拿了日常最容易用到的CSDN创作助手&#xff08;每周写文章总是看到&#xff09;和文心一言&#xff08;…

【复杂网络分析与可视化】——通过CSV文件导入Gephi进行社交网络可视化

目录 一、Gephi介绍 二、导入CSV文件构建网络 三、图片输出 一、Gephi介绍 Gephi具有强大的网络分析功能&#xff0c;可以进行各种网络度量&#xff0c;如度中心性、接近中心性、介数中心性等。它还支持社区检测算法&#xff0c;可以帮助用户发现网络中的群组和社区结构。此…

机场信息集成系统系列介绍(3):机场运行核心数据库(AODB)

目录 1、背景&#xff1a;什么是AODB 2、AODB包括哪些内容 3、AODB还应该适配哪些场景 4、一点点拓展 机场运行核心数据库&#xff08;AODB&#xff09;Airport Operation DataBase 1、背景&#xff1a;什么是AODB 在机场繁重的航班保障和旅客服务背后&#xff0c;庞大的…

Prometheus如何使用 Push 方式采集目标服务器数据

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享 在上篇主要介绍了从零开始&#xff1a;使用Prometheus与Grafana搭建监控系统&#xff0c;我们了解了Prometheus采集数据主要是采用Pull模式&#xff0c;即主动拉取模式&#xff0c;这种…

权重衰减weight_decay

查了好几次了&#xff0c;一直忘&#xff0c;记录一下 使用L 2 范数的一个原因是它对权重向量的大分量施加了巨大的惩罚。这使得我们的学习算法偏向于在大量特征上均匀分布权重的模型。在实践中&#xff0c;这可能使它们对单个变量中的观测误差更为稳定。 相比之下&#xff0c…