【Linux】gawk编辑器二
一、变量
gawk编程语言支持两种变量:内建变量和自定义变量。
1、内建变量
gawk使用内建变量来引用一些特殊的功能。
字段和记录分隔符变量
数据字段变量
此变量允许使用美元符号($)和字段在记录中的位置值来引用对应的字段。要引用记录中的第一个数据字段,就用变量 $1,要引用第二个数据字段,就用变量 $2,以此类推。
数据字段由字段分隔符划定。默认情况下,字段分隔符是一个空白字符:空格或制表符。可以通过使用命令行选项 -F ,或者使用特殊的内建变量 FS 修改字段分隔符。
FIELDWIDTHS | 由空格分隔的一列数字,定义了每个数据字段的确切宽度 |
FS | 输入字段分隔符 |
RS | 输入记录分隔符 |
OFS | 输出字段分隔符 |
ORS | 输出记录分隔符 |
默认情况下,gawk会将OFS变量的值设置为一个空格。print命令会自动将OFS变量的值置于输出的每个字段之间。
gawk 'BEGIN{FS=","} {print $1,$2,$3}' test2.txt
可以通过设置0FS变量,可以在输出中用任意字符串来分隔字段。
gawk 'BEGIN{FS=","; OFS="*"} {print $1,$2,$3}' test2.txt
FIELDWIDTHS变量可以不通过字段分隔符读取记录。一旦设置了此变量,gawk就会忽略FS变量,并根据提供的字段宽度计算字段。
gawk 'BEGIN{FIELDWIDTHS="2 4 5 3"} {print $1,$2,$3,$4}' test3.txt
变量RS和ORS定义了gawk对数据流中记录的处理方式。默认情况下,gawk会将RS和ORS设置为换行符。
默认的RS值表明,输入数据流中的每行文本就是一条记录。
包含地址和电话号码的数据中,占据了多行
可以把FS变量设置成换行符,这样就表明数据流中的每一行都是一个单独的字段,行内的所有数据都属于同一个数据字段。同时把RS变量设置成空字符串,然后在数据记录之间留一个空行。gawk就会把每一个空行视为记录分隔符。
gawk 'BEGIN{FS="\n"; RS=""} {print $1,$3}' test3.txt
gawk将文件中的每一行都视为一个字段,同时将空行作为记录分隔符。
数据变量
ENVIRON变量使用关联数组来提取shell环境变量,其中关联数组用文本而非数值作为数组索引。
如下所示,可以用这种方法从shell中提取任何环境变量的值,以供gawk脚本使用。
gawk '
BEGIN{
print ENVIRON["HOME"]
print ENVIRON["PATH"]
}'
变量FNR、NF和NR用于在gawk脚本中跟踪数据字段和记录。
变量NF可以让用户在不知道具体位置的情况下引用记录中的最后一个数据字段。NF变量含有数据文件中的最后一个字段的编号,在其前面加上美元符号,就把它用作字段变量。
gawk 'BEGIN{FS=":" ; OFS=":"} {print $1,$NF}' /etc/passwdgawk 'BEGIN{FS=":" ; OFS=":"} {$NF}' /etc/passwd
注意看执行两条命令后打印出来的区别之处。
FNR变量包含当前数据文件中已处理过的记录数,NR变量包含已处理过的记录总数。
gawk 'BEGIN{FS=","}{print $1, "FNR="FNR}' test2.txt test2.txt
上述gawk脚本在命令行中指定了两个输入文件(都是test2.txt),此脚本会打印第一个字段和FNR变量的当前值。
gawk 'BEGIN{FS=","}{print $1, "FNR="FNR, "NR="NR}
END{print "这儿总共有",NR,"条记录被处理了"}'' test2.txt test2.txt
在gawk处理第二个数据文件时,FNR变量的值被重置了,而NR变量则继续计数。
因此,如果只使用一个数据文件作为输入,那么FNR和NR的值是相同的;如果使用多个数据文件作为输入,那么FNR的值会在处理每个数据文件时被重置,NR的值则会继续计数直到处理完所有的数据文件。
2、自定义变量
gawk自定义变量的名称由任意数量的字母、数字和下划线组成,但不能以数字开头。而且,其变量名区分大小写。
在脚本中给变量赋值
在gawk脚本中给变量赋值与给shell脚本中的变量赋值一样,都使用赋值语句。
gawk '
BEGIN{
test1="测试……"
print test1
}'
也可以保存数值或文本值:
gawk '
BEGIN{
test1="测试……"
print test1
test1=89
print test1
}'
还可以处理数学算式:
gawk 'BEGIN{x=7; x=x *9 + 10; print x}'
在命令行中给变量赋值
可以在不修改脚本代码的情况下改变脚本的行为。
BEGIN{FS=","}
{print $n}
gawk -f test.sh n=3 test2.txt
通过上述命令,可以显示文件中的第3个字段(n=3)。
使用命令行参数来定义变量值会产生一个问题:在设置过变量之后,这个值在脚本的BEGIN部分不可用。
BEGIN{print "开始值是",n; FS=","}
{print $n}
gawk -f test.sh n=3 test2.txt
使用 -v 选项解决该问题,它允许在BEGIN部分之前设定变量。它必须放在脚本代码之前。
gawk -v n=3 -f test.sh test2.txt
二、数组
gawk使用关联数组来提供数组的功能。与数字型数组不同,关联数组的索引可以是任意文本字符串,它用各种字符串来引用数组元素,每个索引字符串都必须能够唯一地标识出分配给它的数组元素。就跟其它语言中的哈希表、字典类似。
1、定义数组变量
使用标准赋值语句定义数组变量。
格式:var[index] = element
var:变量名;index:关联数组的索引值;element:数组元素值
gawk 'BEGIN{
capital["中国"] = "北京"
print capital["中国"]
}'
2、遍历数组变量
在gawk脚本中遍历关联数组,使用for语句的一种特殊形式。
for {var in array}
{
statements
}
此for语句会在每次循环时将关联数组array的下一个索引值赋给变量var,然后执行一遍statements。变量var中存储的是索引而不是数组元素值。
gawk 'BEGIN{
var["a"] = 10
var["h"] = 190
var["k"] = 78
var["t"] = "hello"
for (test in var)
{print "索引:",test," - 值:", var[test]
}
}'
如下所示,索引值没有固定的返回顺序。
3、删除数组变量
从关联数组中删除数组元素要使用一个特殊的命令:
delete array[index]
delete命令会从关联数组中删除索引值及其相关的数组元素值。
gawk 'BEGIN{
var["a"] = 10
var["h"] = 190
var["k"] = 78
var["t"] = "hello"
for (test in var)
{print "索引:",test," - 值:", var[test]
}delete var["k"]
print "*****"
for (test in var)
{ print "索引:",test," - 值:", var[test]
}
}'
三、使用模式
gawk支持几种类型的匹配模式来过滤数据记录。比如,关键字BEGIN和END可以在读取数据流之前或之后执行命令的特殊模式。
1、正则表达式
可以使用基础正则表达式(BRE)或扩展正则表达式(ERE)来筛选数据。
在使用正则表达式时,它必须出现在与其对应脚本的左花括号前。
# 匹配含有字符串“11”的数据
gawk 'BEGIN{FS=","} /11/{print $1}' test2.txt
#匹配用作字段分隔符的逗号
gawk 'BEGIN{FS=","} /,d/ {print $1}' test2.txt
2、匹配操作符
匹配操作符(~)是一个很强大的工具,可以将正则表达式限制在记录的特定数据字段。可以指定匹配操作符、数据字段变量以及要匹配的正则表达式。
$1 ~ /^data/:此表达式会过滤出第一个数据字段以data开头的所有记录。
gawk 'BEGIN{FS=","} $2 ~ /^data3/{print $0}' test2.txt
匹配第2个数据字段要以“data3”开头的数据。
可以用它在文件中搜索特定的数据元素。
gawk -F: '$1 ~ /csb/{print $1, $NF}' /etc/passwd
上面的脚本命令会在第一个数据字段中查找文本“csb”,如果匹配成功,则打印出第一个数据字段和最后一个数据字段。
也可以使用 ! 符号来排除正则表达式的匹配:
$1 !~ /expression/
gawk -F: '$1 !~ /^csb/{print $1,$NF}' /etc/passwd
匹配第一个数据字段不是以“csb”开头的数据, 如果匹配成功,则打印出第一个数据字段和最后一个数据字段。
3、数学表达式
显示出所有属于root用户组(组ID为0)的用户。
下面的gawk脚本会检查记录中值为0的第四个字段。
gawk -F: '$4 == 0{print $1}' /etc/passwd
也可以对文本数据使用表达式,但跟正则表达式不同,表达式必须完全匹配。
gawk -F, '$1 == "data"{print $1}' test2.txtgawk -F, '$1 == "data21"{print $1}' test2.txt
四、结构化命令
1、if 语句
gawk编程语言支持标准格式的 if-then-else 语句。
gawk '{
if ($1 > 30)
{x = $1 * 2print x
}
}' test3.txt
gawk '{
if ($1 < 30)
{x = $1 * 2print x
} else
{x = $1 / 2print x
}}' test3.txt
也可以在单行中使用else语句。
gawk '{if ($1 < 30) print $1 * 2; else print $1 / 2}' test3.txt
2、while语句
gawk '{
total = 0
i = 1
while (i <=3)
{total += $ii++
}
avg = total / 3
print "平均值是:", avg
}' test1.txt
还可以使用break语句和continue语句
gawk '{
total = 0
i = 1
while (i <= 3)
{total += $iif (i == 2)breaki++
}
avg = total / 2
print "前两个数据的平均值是:", avg
}' test1.txt
3、do-while语句
do-while语句与while语句类似,但会在检查条件语句之前先执行命令。
gawk '{
total = 0
i = 1
do
{total += $ii++
} while (total < 200)
print total
}' test1.txt
4、for语句
gawk '{
total = 0
for (i = 1; i <=3; i++)
{total += $i
}
avg = total /3
print "平均值是:",avg
}' test1.txt
五、格式化打印
和C语言编程一样,gawk中的格式化打印命令 printf 可以控制如何显示数据
格式:printf "format string, var1, var2
format string是格式化输出的关键,它会用文本元素和格式说明符来具体指定如何呈现格式化输出。格式说明符是一种特殊的代码,可以指明显示什么类型的变量以及如何显示。
1、控制字母
gawk脚本会将每个格式说明符作为占位符,供命令中的每个变量使用。第一个格式说明符对应列出第一个变量,第二个对应第二个变量,以此类推。
c | 将数字作为ASCII字符显示 |
d | 显示整数值 |
i | 显示整数值 |
e | 用科学计数法显示数字 |
f | 显示浮点值 |
g | 用科学计数法或浮点数显示(较短的格式优先) |
o | 显示八进制值 |
s | 显示字符串 |
x | 显示十六进制值 |
X | 用大写字母显示十六进制值 |
gawk 'BEGIN{
x = 10 * 10000
printf "结果是:%e\n", x
}'
2、修饰符
除了控制字母,还有3种修饰符可以进一步控制输出。
width
指定输出字段的最小宽度。如果输出短于这个值,则printf会将文本右对齐,并用空格进行填充。如果输出比指定的宽度长,则按实际长度输出。
prec
指定浮点数中小数点右侧的位数或者字符串中显示的最大字符数。
减号 -
指明格式化空间中的数据采用左对齐而非右对齐
在同一行中打印多个输出。
gawk 'BEGIN{FS=","} {printf "%s ", $1} END{printf "\n"}' test2.txt
使用修饰符格式化第一个字符串的值
gawk 'BEGIN{FS="\n"; RS=""} {printf "%10s %s\n", $1, $2}' test1.txt
使用printf处理浮点值
gawk '{
total = 0
for (i = 1; i <=3; i++)
{total += $i
}
avg = total / 3
printf "平均值是:%8.1f\n",avg
}' test3.txt
%8.1f强制printf命令将浮点值近似到小数点后一位。
六、内置函数
gawk编程语言提供了一些内置函数用于执行一些常见的数学、字符串以及时间运算。
1、数学函数
atan(x,y) | x/y的反正切,x和y以弧度为单位 |
cos(x) | x的余弦,x以弧度为单位 |
exp(x) | x的指数 |
int(x) | x的整数部分,取靠近0一侧的值 |
log(x) | x的自然对数 |
rand() | 比0大且比1小的随机浮点数 |
sin(x) | x的正弦,x以弧度为单位 |
sqrt(x) | x的平方根 |
srand(x) | 为计算随机数指定一个种子值 |
and(v1,v2) | 对v1和v2执行按位AND运算 |
comp1(v1) | 对v1执行补运算 |
lshift(val,count) | 将val左移count位 |
or(v1,v2) | 对v1和v2执行按位OR运算 |
rshift(val,count) | 将val右移count位 |
xor(v1,v2) | 对v1和v2执行按位XOR运算 |
产生较大随机整数的常见方法是综合运用rand()函数和int()函数:
x = int(10 * rand())
上述命令会返回一个0~9(包括0和9)的随机整数值。
2、字符串函数
index(s,t) | 返回字符串t在字符串s中的索引位置;如果没找到,则返回0 |
length([s]) | 返回字符串s的长度;如果没有指定,则返回$0的长度 |
match(s,r [,a]) | 返回正则表达式r在字符串s中匹配位置的索引。如果指定了数组a,则将s的匹配部分保存在该数组中 |
split(s,a [,r]) | 将s以FS(字段分隔符)或正则表达式r(如果有指定的话)分割并放入数组a中。返回分割后的字段总数 |
sub(r,s [,t]) | 在变量$0或目标字符串t中查找匹配正则表达式r的部分。如果找到了,就用字符串s替换第一处匹配 |
substr(s,i [,n]) | 返回s中从索引 i 开始、长度为n的子串。如果未提供n,则返回s中剩下的部分 |
tolower(s) | 将s中的所有字符都转换成小写 |
toupper(s) | 将s中的所有字符都转换成大写 |
gawk 'BEGIN{x = "ning"; print toupper(x); print length(x)}'
3、时间函数
时间函数多用于处理日志文件。日志文件中一般含有需要进行比较的日期。通过将日期的文本表示形式转换成纪元时(自1970-01-01 00:00:00 UTC到现在的秒数),可以做到很容易就比较日期。
mktime(dataspec) | 将一个按YYYY MM DD HH MM SS [DST]格式指定的日期转换成时间戳 |
strftime(format [, timestamp]) | 将当前时间的时间戳或timestamp(如果提供了的话)转化成格式化日期(采用shell命令date的格式) |
systime() | 返回当前时间的时间戳 |
gawk 'BEGIN{
date = systime()
day = strftime("%A, %B %d, %Y", date)
print day
}'
七、自定义函数
可以在gawk脚本中自己创建函数。
1、定义函数
定义自己的函数,必须使用function关键字。
function name([variables])
{
statements
}
function myrand(limit)
{ return int(limit * rand())
}
2、使用自定义函数
定义函数时,它必须出现在所有代码块之前(包括BEGIN代码块)。
gawk '
function myrand(limit)
{ return int(limit * rand())
}
BEGIN{x = myrand(8)print x
}'
3、创建函数库
gawk提供了一种方法可以将多个函数放入单个库文件中。
首先,创建一个包含所有gawk函数的文件
# 函数库名:functionlib
function myrand(limit)
{ return int(limit * rand())
}function myprint()
{printf "%-16s - %s\n", $1, $4
}function printthird()
{print $3
}
接着,使用函数库时,只要创建好gawk脚本文件,然后在命令行中同时指定库文件和脚本文件即可。
# gawk脚本名 test
BEGIN{ FS="\n"; RS=""}
{myprint()
}
然后执行下述命令即可。(-f选项不能和内联gawk脚本一起使用,所以要在同一命令行中使用多个 -f 选项。)
gawk -f functionlib -f test test2.txt
相关文章:

【Linux】gawk编辑器二
一、变量 gawk编程语言支持两种变量:内建变量和自定义变量。 1、内建变量 gawk使用内建变量来引用一些特殊的功能。 字段和记录分隔符变量 数据字段变量 此变量允许使用美元符号($)和字段在记录中的位置值来引用对应的字段。要引用记录…...

Hadoop美食推荐系统 爬虫1.8w+数据 协同过滤余弦函数推荐美食 Springboot Vue Element-UI前后端分离
Hadoop美食推荐系统 爬虫1.8w数据 协同过滤余弦函数推荐美食 Springboot Vue Element-UI前后端分离 【Hadoop项目】 1. data.csv上传到hadoop集群环境 2. data.csv数据清洗 3.MapReducer数据汇总处理, 将Reducer的结果数据保存到本地Mysql数据库中 4. SpringbootEchartsMySQL 显…...

吴恩达深度学习——神经网络编程的基础知识
文章内容来自BV11H4y1F7uH,仅为个人学习所用。 文章目录 二分分类一些符号说明 逻辑斯蒂回归传统的线性回归函数 y ^ w T x b \hat{y}w^T\boldsymbol{x}b y^wTxbSigmoid激活函数逻辑斯蒂回归损失函数损失函数成本函数与损失函数的关系 梯度下降法计算图逻辑斯蒂…...

第14个项目:E-Learning在线学习平台Python源码
源码下载地址:https://download.csdn.net/download/mosquito_lover1/90292074 系统截图: 功能介绍: 响应式设计,完全支持移动端 现代化的UI界面 用户认证系统 课程展示功能 模块化的结构 要进一步完善这个应用,您可以: 添加用户认证系统(登录/注册) 实现课程详情页面…...

Qt之文件系统操作和读写
Qt creator 6.80 MinGw 64bit 文本文件是指以纯文本格式存储的文件,如cpp和hpp文件。XML文件和JSON文件也是文本文件,只是使用了特定的标记符号定义文本的含义,读取这种文本文件需要先对内容解析再显示。 qt提供了两种读写文本文件的方法。…...

【物联网】keil仿真环境设置 keilV5可以适用ARM7
文章目录 一、ARM指令模拟器环境搭建1. keil软件2. Legacy Support 二、Keil仿真环境设置1. 创建一个项目2. 编译器介绍(1)arm-none-eabi-gcc(2)arm-none-linux-gnueabi-gcc(3)arm-eabi-gcc(4)grmcc(5)aarch64-linux-gnu-gcc 3. 安装编译器(1)设置调试 一、ARM指令模拟器环境搭…...

VIVADO ILA IP进阶使用之任意设置ILA的采样频率
VIVADO ILA IP进阶使用之任意设置ILA的采样频率 VIVADO ILA IP和VIO IP结合使用任意设置ILA的采样频率 目录 前言 一、VIO IP的配置 二、ILA IP的配置 三、测试代码 四、测试结果 总结 前言 VIVADO中编写完程序上板测试时经常会用到viavdo自带的ILA逻辑分析仪IP核&#x…...

网络编程-网络原理HTTP初识
文章目录 TCP/IP五层协议栈关于自定义协议常见自定义协议引入行文本格式XML格式JSONprotobuf HTTP原理非自定义的应用层协议HTTP的发展HTTP的传输模式HTTP协议中的代理模式和抓包工具 TCP/IP五层协议栈 具体的内容, 我们之前的网络初始里面有, 其实就是先前的计算机的发明者把…...

基于若依框架的动态分页逻辑的实现分析
如果让我们自己写分页查询的逻辑,应该怎么写呢? 在前端要完成分页的逻辑实际要做的工作还是挺多的。 分页查询应该支持查询参数的输入,对于一个有众多属性的列表,可能有很多查询参数,对于不同的参数类型,…...

51c~ONNX~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/11608027 一、使用Pytorch进行简单的自定义图像分类 ~ONNX 推理 图像分类是计算机视觉中的一项基本任务,涉及训练模型将图像分类为预定义类别。本文中,我们将探讨如何使用 PyTorch 构建一个简单的自定…...

【数据结构篇】顺序表 超详细
目录 一.顺序表的定义 1.顺序表的概念及结构 1.1线性表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 二.动态顺序表的实现 1.准备工作和注意事项 2.顺序表的基本接口: 2.0 创建一个顺序表 2.1 顺序表的初始化 2.2 顺序表的销毁 2.3 顺序表的打印 3.顺序…...
kubernetes 集群搭建(二进制方式)
Kubernetes 作为当今最流行的容器编排平台,提供了强大的功能来管理和扩展容器化应用。除了使用 kubeadm 等工具简化集群的创建过程外,直接通过二进制文件安装 Kubernetes 组件也是一种常见的方法。这种方式给予用户更多的控制权,并且适用于那…...

linux平台RTMP|RTSP播放器如何回调SEI数据?
我们在对接Linux平台RTMP|RTSP播放的时候,有遇到这样的技术需求,合作企业在做无人机视觉分析场景的时候,除了需要低延迟的拿到解码后的RGB|YUV数据,然后投递给他们自己的视觉算法处理模块外,还需要播放器支持SEI的回调…...
Vue uni-app免手动import
unplugin-auto-import 是一个流行的 JavaScript/TypeScript 插件,可以自动导入常用的库、API 或自定义函数,减少手动书写 import 语句的繁琐操作。它常用于 Vue、React 等框架,帮助开发者提高效率和减少样板代码。 核心功能: 自…...
7. 计算机视觉
计算机视觉(Computer Vision,简称 CV)是人工智能(AI)领域中的一个重要分支,旨在使计算机能够像人类一样“看”并理解数字图像或视频。它结合了计算机科学、数学、图像处理、模式识别、机器学习等多个学科&a…...
在服务器进行docker部署频繁提示permission denied
当你频繁遇到permission denied,证明当前用户的权限不够 可以参考如下操作: 1.创建用户组docker sudo groupadd docker把当前用户添加到docker用户组中 sudo usermod -aG docker $USER优点: 可以在不使用sudo的情况下运行docker命令...
c/c++ static
定义 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。修饰普通函数,表明函数的作…...
C#中System.Text.Json:从入门到精通的实用指南
一、引言 在当今数字化时代,数据的高效交换与处理成为软件开发的核心环节。JSON(JavaScript Object Notation)凭借其简洁、轻量且易于读写的特性,已然成为数据交换领域的中流砥柱。无论是前后端数据交互,还是配置文件…...

内存故障原因与诊断(Reasons and Diagnosis of Memory Failure)
内存故障原因与诊断 您是否曾遇到过电脑无法启动、黑屏、死机,或者系统卡顿的情况?这些问题看起来很复杂,实际上大多数都是内存故障引起的。内存是电脑的核心组成部分之一,任何小东西问题都可能导致系统死机,严重时甚…...

[操作系统] 进程状态详解
在操作系统中,进程是程序执行的基本单位,操作系统负责管理进程的生命周期。为了高效地管理进程,操作系统通过定义不同的进程状态来表示进程在不同时间点的行为。本文将详细介绍常见的进程状态及其相互之间的转换过程。 进程状态概述 在kerne…...
【Redis】Redis从入门到实战:全面指南
Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...

使用VMware克隆功能快速搭建集群
自己搭建的虚拟机,后续不管是学习java还是大数据,都需要集群,java需要分布式的微服务,大数据Hadoop的计算集群,如果从头开始搭建虚拟机会比较费时费力,这里分享一下如何使用克隆功能快速搭建一个集群 先把…...

【自然语言处理】大模型时代的数据标注(主动学习)
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构D 实验设计E 个人总结 A 论文出处 论文题目:FreeAL: Towards Human-Free Active Learning in the Era of Large Language Models发表情况:2023-EMNLP作者单位:浙江大…...
小白的进阶之路系列之十四----人工智能从初步到精通pytorch综合运用的讲解第七部分
通过示例学习PyTorch 本教程通过独立的示例介绍PyTorch的基本概念。 PyTorch的核心提供了两个主要特性: 一个n维张量,类似于numpy,但可以在gpu上运行 用于构建和训练神经网络的自动微分 我们将使用一个三阶多项式来拟合问题 y = s i n ( x ) y=sin(x) y=sin(x),作为我们的…...
命令行运行python程序报错 ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6
命令行运行python程序报错 ImportError: /lib/x86_64-linux-gnu/libstdc.so.6 ImportError: /lib/x86_64-linux-gnu/libstdc.so.6: version GLIBCXX_3.4.29’ not found (required by /home/zitong/miniconda3/envs/torch112/lib/python3.9/site-packages/scipy/spatial/_ckdt…...

【汇编逆向系列】三、函数调用包含单个参数之float类型-xmm0寄存器,sub,rep,stos,movss,mulss,addss指令
一、汇编代码 single_float_param:0000000000000060: F3 0F 11 44 24 08 movss dword ptr [rsp8],xmm00000000000000066: 57 push rdi0000000000000067: 48 83 EC 10 sub rsp,10h000000000000006B: 48 8B FC mov …...
iOS 抖音导航栏首页一键分两列功能的实现
要实现 iOS 抖音首页导航栏的“一键分两列”功能(通常指将单列内容切换为双列瀑布流布局),需结合自定义导航栏控件与布局动态切换逻辑。以下是关键实现步骤和技术要点,基于 iOS 原生开发框架(Swift/Objective-C&#x…...
MCP(Model Context Protocol)与提示词撰写
随着大模型(LLM)在复杂任务中的普及,如何让模型高效调用外部工具和数据成为关键挑战。传统函数调用(Function Calling)依赖开发者手动封装 API,而 MCP(Model Context Protocol) 通过…...

让音乐“看得见”:使用 HTML + JavaScript 实现酷炫的音频可视化播放器
在这个数字时代,音乐不仅是听觉的享受,更可以成为视觉的盛宴!本文用 HTML + JavaScript 实现了一个音频可视化播放器,它不仅能播放本地音乐、控制进度和音量,还能通过 Canvas 绘制炫酷的音频频谱图,让你“听见色彩,看见旋律”。 效果演示 核心功能 本项目主要包含以下…...

[RDK X5] MJPG编解码开发实战:从官方API到OpenWanderary库的C++/Python实现
业余时间一直在基于RDK X5搞一些小研究,需要基于高分辨率图像检测目标。实际落地时,在图像采集上遇到了个大坑。首先,考虑到可行性,我挑选了一个性价比最高的百元内摄像头,已确定可以在X5上使用,接下来就开…...