【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…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...