SHELL脚本学习(十四)gawk进阶

一、使用变量

gawk支持两种变量

  • 内建变量
  • 自定义变量
1.1 内建变量
1.1.1 字段和记录分隔符变量

数据字段变量允许使用美元符号 $ 和 位置来引用对应的字段。 $1 对应第一个数据字段,$2对应第二个数据字段,以此类推。

数据字段用字段分隔符划定。默认情况下,字段分隔符是一个空白字符(空格或制表符)。可以通过 -F选项修改字段分隔符。也可以使用特殊的内建变量FS修改字段分隔符。

有一组内建变量可以控制输入和输出数据中字段和记录的处理方式:

gawk数据字段和记录变量

变 量描 述
FIELDWIDTHS由空格分隔的一串数字,定义了每个数据字段的确切宽度
FS输入字段分隔符
RS输入记录分隔符
OFS输出字段分隔符
ORS输出记录分隔符
$ cat < data1
header line
data line 1
End of data line#默认情况
$ gawk '{print $1,$2}' data1
header line
data line
End of#1、OFS测试$ gawk 'BEGIN{OFS="|-|"}
{print $1,$2}' data1
header|-|line
data|-|line
End|-|of#2、ORS测试$ gawk 'BEGIN{ORS="|-|"}
{print $1,$2}
END{print "\n"}' data1 
header line|-|data line|-|End of|-|

默认输出字段分隔符是空格,第1个例子将输出字段分隔符换成了"|-|“。
默认输出记录分隔符是换行,第2个例子将输出记录分隔符换成了”|-|"。

FIELDWIDTHS会根据提前设置好的字段宽度来划分字段。

下面这个例子将固定格式的时间划分成 年、月、日、时、分

$ cat <data2
202401011015
202402020900
202403030130$ gawk 'BEGIN{
FIELDWIDTHS="4 2 2 2 2 2"}
{print $1,$2,$3,$4,$5}' data2
2024 01 01 10 15 
2024 02 02 09 00 
2024 03 03 01 30 

FS默认为空白符,RS默认为换行符。也就是说gawk默认一行为一条记录。但有时一行数据是一个字段,多行数据组成一条记录。这时可以将FS设置成\n,将RS设置成空字符串。

$ cat <data3
zhangsan
17
haerbinlisi
20
beijing$ gawk 'BEGIN{FS="\n";RS=""}
{print"name:"$1,"age:"$2,"city:"$3}' data3
name:zhangsan age:17 city:haerbin
name:lisi age:20 city:beijing
1.1.2 数据变量

除了字段和记录分隔符变量外,gawk还提供了其他一些变量帮助了解数据的变化。

更多的gawk内建变量

变量描述
ARGC命令行参数的数量
ARGIND当前处理的文件在ARGV中的索引
ARGV包含命令行参数的数组
CONVFMT数字的转换格式(参见printf语句),默认为%.6g
ENVIRON当前环境变量及其值组成的关联数组
ERRNO当读取或关闭输入文件发生错误时的系统错误号
FILENAME用作gawk输入的数据文件的名称
FNR当前数据文件中已处理的记录数
IGNORECASE非0表示忽略大小写
NF数据文件中的字段总数
NR已处理的输入记录数
OFMT数字的输出格式。默认值为%.6g。以浮点数或科学计数法表示,以较短者为准,最多是使用6位小数
RLENGTH由match函数所匹配的子串长度
RSTART由match函数所匹配的子串的起始位置

下面测试几个常用的变量

#ARGC:命令行参数的数量
#ARGV:当前处理的文件在ARGV中的索引
$ gawk 'BEGIN{print ARGC,ARGV[0],ARGV[1],ARGV[2]}' data1 data2
3 gawk data1 data2#ENVIRON:当前环境变量及其值组成的关联数组
$ gawk 'BEGIN{print ENVIRON["HOME"]}' 
/home/ubuntu#FILENAME :用作gawk输入的数据文件的名称
$ gawk 'END{print FILENAME}' data1
data1
$ cat < data1
header line
data line 1
End of data line$ cat <data2
202401011015
202402020900
202403030130#NR:已处理的输入记录数
#FNR:当前数据文件中已处理的记录数
#NF:数据文件中的字段总数
#$NF:最后一个字段的值
$ gawk '{print "NR="NR,"FNR="FNR,"NF="NF,"$NF="$NF}' data1 data2
NR=1 FNR=1 NF=2 $NF=line
NR=2 FNR=2 NF=3 $NF=1
NR=3 FNR=3 NF=4 $NF=line
NR=4 FNR=1 NF=1 $NF=202401011015
NR=5 FNR=2 NF=1 $NF=202402020900
NR=6 FNR=3 NF=1 $NF=202403030130
NR=7 FNR=4 NF=0 $NF=
1.2 自定义变量

gawk的自定义变量由任意个字母、数字和下划线组成,但不能以数字开头。
gawk自定义变量区分大小写。

1.2.1 在脚本中为变量赋值
$ gawk 'BEGIN{test="this is a test.";print test}'
this is a test.$ gawk 'BEGIN{test=100;print test*(test-1)}'
9900$ gawk 'BEGIN{test=100;print test^2}'
10000
1.2.2 在命令行中给变量赋值
$ cat <data1
header line
data line 1
End of data line$ gawk '{print $field}'  field=1 data1
header
data
End$ gawk '{print $field}'  field=2 data1
line
line
of

这个例子通过在命令行中给变量赋值,可以显示不同的字段。
这个特性可以在不改变脚本代码的情况下改变脚本的行为。

使用命令行参数定义变量有一个问题:设置变量后,这个变量在BEGIN模块不可用
如下:

$ gawk 'BEGIN {print "field="field}' field=3 data1
field=

可以用 -v选项解决这个问题。-v选项允许在BEGIN之前定义变量。

$ gawk -v field=3 'BEGIN {print "field="field}' field=3 data1
field=3
二、处理数组

数组用于单个变量存储多个值,gawk语言使用关联数组提供数组功能。类似c++中的unorder_map。

2.1 定义数组变量

可以用赋值语句定义数组变量。格式如下;

var[index]=element
var:数组变量名
index:索引
element:索引对应的值

$ gawk 'BEGIN{arr["name"]="lilei";arr["age"]=20;
print arr["name"],arr["age"]}'
lilei 20
2.2 遍历数组变量

格式:

for index in array
{
 statement
}

for语句每次循环时会把下一个数组元素的索引赋值给index。

$ gawk 'BEGIN{arr["name"]="lilei";arr["age"]=20;
for (ind in arr)
{
print "arr["ind"]="arr[ind]
}}'
arr[age]=20
arr[name]=lilei

索引没有固定的返回顺序。

2.3 删除数组变量

从关联数组中删除数据需要使用 delete 命令;

delete array[index]

下面使用delete命令的例子

$ cat < gawk_cmd
BEGIN {arr["name"]="lilei";arr["age"]=20;arr["city"]="haerbin";for (ind in arr){print "arr["ind"] :" arr[ind];}delete arr["age"];print "---------"for (ind in arr){print "arr["ind"] :" arr[ind];}
}$ gawk -f gawk_cmd
arr[age] :20
arr[city] :haerbin
arr[name] :lilei
---------
arr[city] :haerbin
arr[name] :lilei

每行代码后面的分号 ( ; ) 写不写都行。

三、 使用模式
3.1 正则表达式

sed 只支持基础正则表达式(BRE),gawk支持基础正则表达式(BRE) 和扩展正则表达式(ERE)。

下面的第1个例子输出张三的年龄,第2个例子输出年龄在20~30之间的人的名字。

$ cat <data3
zhangsan
17
haerbinlisi
20
beijing$ gawk 'BEGIN{FS="\n";RS=""}
/zhangsan/{print $2}' data3
17$ gawk 'BEGIN{FS="\n";RS=""}
/2./{print $1}' data3
lisi
3.2 匹配操作符

匹配操作符 (~) 使用格式:

数据字段 ~ /正则表达式/

和上面的例子相同,下面第1个例子输出zhangsan的年龄,第2个例子输出年龄在20~30之间的人的名字。


$ gawk 'BEGIN{FS="\n";RS=""}
$1 ~ /zhangsan/{print $1,$2,$3}' data3
zhangsan 17 haerbin$ gawk 'BEGIN{FS="\n";RS=""}
$2 ~ /^2.$/{print $1,$2,$3}' data3
lisi 20 beijing
3.3 数学表达式

处理正则表达式,gawk还可以在匹配模式中使用数学表达式。
可以使用任何常见的数学表达式:

操作符描述
==等于
<=小于等于
<小于
>大于
>=大于等于

还是相同的例子,输出张三的年龄

$ cat <data3
zhangsan
17
haerbinlisi
20
beijing$ gawk 'BEGIN{FS="\n";RS=""}
$1=="zhangsan"{print "age="$2}' data3
age=17
四、结构化命令

gawk 中的结构化命令和 c语言 中的分支和循环结构基本一致。

4.1 if语句

输出年龄是否大于18岁

$ cat <data3
zhangsan
17
haerbinlisi
20
beijing$ cat < gawk_cmd
BEGIN {FS="\n"RS=""print "Begin"
}{cmp=""age=18if ($2 <= age){cmp=" less than "}else{cmp=" greater than "}print $1 cmp,age
}END{print "End of file"
}$ gawk -f gawk_cmd data3
Begin
zhangsan less than  18
lisi greater than  18
End of file
4.2 while 语句

格式:

while (condition)
{
 statements
}

下面例子输出某次跳远比赛各个选手的平均成绩。

$ cat < data1
5.5 6.5 7.5
6.6 6.5 6.5
6.6 7.5 5.9$ cat < gawk_cmd
BEGIN {print "Begin"
}{i=1sum=0.0while (i <= NF){sum+=$ii++}print sum/NF
}END{print "End of file"
}$ gawk -f gawk_cmd data1
Begin
6.5
6.53333
6.66667
End of file
4.3 do-while语句

格式:

do
{
 statements
}
while (condition)

do-whilewhile 唯一区别是 do-while保证statements会在条件被求值之前至少执行一次。

4.4 for语句

格式:

for (变量赋值; condition; 迭代处理)
{
 statements
}

下面使用for语句计算跳远比赛的平均成绩。

$ cat < gawk_cmd
BEGIN {print "Begin"
}{sum=0.0for(i=1;i<=NF;i++){sum+=$i}print sum/NF
}END{print "End of file"
}$ gawk -f gawk_cmd data1
Begin
6.5
6.53333
6.66667
End of file
五、格式化打印
5.1 printf 命令

gawk中的printf命令和 C语言 中的printf函数一样。
格式:

printf “format string”,var1,var2…

格式说明符的控制字母

控制字母描述
c数字作为ASCII字符显示
d和i显示整数值
e用科学计数法显示数字
f显示浮点数
g用科学计数法或浮点数显示(较短的格式有限)
o显示八进制
s显示字符串
x显示十六进制
X显示十六进制,但用大写字母A-F
#将输入数据当做字符串
$ echo "200.33333"| gawk '{printf "%s\n",$1}'
200.33333#将输入数据当作小数并保留两位小数
$ echo "200.33333"| gawk '{printf "%2.2f\n",$1}'
200.33#将输入数据当作整数,并且至少输出5位,不足5位向前补0
$ echo "200.33333"| gawk '{printf "%05d\n",$1}'
00200
六、自定义函数
6.1 定义函数

格式:

function name ([variables])
{
  statements
}

6.2 使用函数

使用自定义函数计算平均成绩

$ cat < gawk_cmd
function average(s1,s2,s3)
{return (s1 + s2 + s3)/3
}BEGIN {print "Begin"}{printf "average scores:%.2f\n",average($1,$2,$3)
}END{print "End of file"
}$ gawk -f gawk_cmd data1
Begin
average scores:6.50
average scores:6.53
average scores:6.67
End of file
6.3 函数库

也可以把常用的函数放到一个文件中,封装成函数库。

$ cat < lib_func
function average(s1,s2,s3)
{return (s1 + s2 + s3)/3
}$ cat < lib_func
function average(s1,s2,s3)
{return (s1 + s2 + s3)/3
}
ubuntu@VM-8-14-ubuntu:~$ cat < gawk_cmdBEGIN {print "Begin"
}{printf "average scores:%.2f\n",average($1,$2,$3)
}END{print "End of file"
}$ gawk -f lib_func -f gawk_cmd  data1
Begin
average scores:6.50
average scores:6.53
average scores:6.67
End of file

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

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

相关文章

【基于R语言群体遗传学】-1-哈代温伯格基因型比例

前言 群体遗传学是研究生物群体中基因的分布、基因频率和基因型频率的维持和变化的学科。它不仅探讨遗传病的发病频率和遗传方式&#xff0c;还研究基因频率和变化的规律&#xff0c;为预防、监测和治疗遗传病提供重要信息。R语言作为一种强大的统计分析工具&#xff0c;在群体…

mybatis实现多表查询

mybatis高级查询【掌握】 1、准备工作 【1】包结构 创建java项目&#xff0c;导入jar包和log4j日志配置文件以及连接数据库的配置文件&#xff1b; 【2】导入SQL脚本 运行资料中的sql脚本&#xff1a;mybatis.sql 【3】创建实体来包&#xff0c;导入资料中的pojo 【4】User…

TypeScript Project References npm 包构建小实践

npm 包输出 es/cjs 产物 在开发一个 npm 包时&#xff0c;通常需要同时输出 ES 模块和 CommonJS 模块的产物供不同的构建进行使用。在只使用tsc进行产物编译的情况下&#xff0c;我们通常可以通过配置两个独立的 tsconfig.json 配置文件&#xff0c;并在一个 npm script 中 执…

kubesphere自定义流水线基础镜像

背景 需求&#xff1a;在流水线基础pod中使用python和jinja2模块来动态渲染部署文件 由于ks提供的基础镜像无法满足以上需求&#xff0c;在ks提供的maven镜像的基础上实现 实施 制作镜像&并推送到private image repo FROM kubesphere/builder-maven:v3.2.0 RUN sed -i…

7.1作业

1.思维导图 2.在堆区申请两个长度为32的空间&#xff0c;实现两个字符串的比较【非库函数实现】 (1)定义函数&#xff0c;在对区申请空间 两个申请&#xff0c;主函数需要调用2次 (2)定义函数&#xff0c;实现字符串的输入 void input(char *p) (3)调用函数实现字符串比较…

BUT000增强字段BAPI结构激活出错(BUPA_CENTRAL_CI_CHANGE)

导语&#xff1a;BP主数据增强字段&#xff0c;需要使用BAPI&#xff1a;BUPA_CENTRAL_CI_CHANGE进行值写入&#xff0c;但是在SAP 2023以后的版本&#xff0c;激活会出错&#xff0c;原因是因为SAP的一个结构同时包含了BUS00_EEW以及BUS00_EEWX两个结构&#xff0c;导致结构字…

Spring Security 认证流程

Spring Scurity是spring生态下用于认证和授权的框架&#xff0c;具有高度的灵活性和可扩展行&#xff0c;本节主要对Spring Security的认证过程中进行概括性的介绍&#xff0c;主要介绍在该过程中&#xff0c;会涉及到哪些组件以及每个组件所承担的职责&#xff0c;希望大家可以…

Elasticsearch 配置说明

# ---------------------------------- Cluster ----------------------------------- cluster.name: yh-es # es名称 # ------------------------------------ Node ------------------------------------ node.name: xibo-es node.master: true node.da…

电脑录音软件哪个好?7款录制音频工具大盘点,赶快学起来!(2024)

也许你渴望提取你最喜欢的节目的背景音乐&#xff0c;或者你希望录制自己的声音制作教程。如果是这样&#xff0c;你就需要一款优秀的电脑录音软件&#xff0c;来帮助你捕捉任何你想要的声音&#xff0c;而且不会损失音质。目前市场上存在着大量的录制音频工具&#xff0c;面对…

锁相环相位噪声仿真代码-汇总

24小时自动发货 所设计的压控振荡器输入电压为0.625V时&#xff0c;输出大致为500Mhz&#xff1b;输入电压为1.559时&#xff0c;输出电压大致为1Ghz 1.文件夹里面各个文件作用&#xff08;包括参考书PLL PHASE NOISE ANALYSIS、lee的射频微电子、以及前人留下的matlab文件还有…

ModStart:开源免费的PHP企业网站开发建设管理系统

大家好&#xff01;今天我要给大家介绍一款超级强大的开源工具——ModStart&#xff0c;它基于Laravel框架&#xff0c;是PHP企业网站开发建设的绝佳选择&#xff01; 为什么选择ModStart&#xff1f; 模块化设计&#xff1a;ModStart采用模块化设计&#xff0c;内置了众多基…

Ubuntu(通用)—网络加固—防DNS污染和ARP欺骗

1. 防DNS污染 DNS协议&#xff0c;把域名解析成ip地址&#xff0c;udp&#xff0c;这个过程会暴露访问的域名&#xff0c; 对这一传输过程加密&#xff08;传输层用tcp&#xff09;即为DoH(DNS over HTTPS)。 Browser(firefox)加固 由于Cloudflare、Quad8的DoH服务器不能用&…

三维重建基础【知识点总结】

三维重建基础【知识点总结】 rasterizationvolumetric ray-marchingSfM&#xff08;Structure from Motion&#xff09;Spherical Harmonics多视图立体&#xff08;Multiple View Stereo, MVS&#xff09;动画制作专业术语 rasterization Rasterization&#xff0c;中文通常译…

雅思词汇及发音积累 2024.7.1

旅游场景 1.credit card 信用卡 2.driving license/licence 驾照 3.expire /ɪkˈspaɪə(r)/ 驾照/护照等过期 4.platform 站台 5.Currency 货币 6.Pound 英镑 7.Deserts /dɪˈzɜːts/ 沙漠 8. hilly areas 丘陵地带 9.wetlands 沼泽地 10.bushlands 灌木丛 11.tropi…

Dns被莫名篡改的问题定位(笔记)

引言&#xff1a;最近发现用户的多台机器上出现了Dns被莫名修改的问题&#xff0c;从系统事件上看并未能正常确定到是那个具体软件所为&#xff0c;现在的需求就是确定和定位哪个软件具体所为。 解决思路&#xff1a; 首先到IPv4设置页面对Dns进行设置&#xff1a;通过ProcExp…

缺失d3dx9_43.dll是怎么回事?教你几种靠谱的解决方法

在日常生活和工作中&#xff0c;电脑已经成为我们不可或缺的工具。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是软件运行时提示d3dx9_43.dll丢失。这个问题会导致软件游戏无法启动运行&#xff0c;但只要我们了解其原因和解…

LinkedHashMap、TreeMap

LinkedHashMap&#xff1a; 有序、不重复、无索引&#xff0c;底层是双链表 TreeMap&#xff1a;底层基于红黑树&#xff0c;可以对键进行排序 默认排序&#xff1a;integer和string都是从小到大排序 例题&#xff1a;

git合并分支的疑问

今天遇到一个奇怪的问题&#xff1a; 1、后端从master拉了三个分支。分别为dev、test、和stage。 2、研发1从dev拉了分支feature1,然后commit、commit、commit……。最后request merge到dev、test和stage。成功了。 3、研发2从dev拉了分支feature2,注意&#xff0c;feature2…

Dataweave2 语法教程

DataWeave 是 MuleSoft 的数据语言&#xff0c;专门用于数据转换和映射。在 MuleSoft 的 Anypoint Platform 中&#xff0c;它是数据集成的一部分。下面是一个 DataWeave 语法教程&#xff0c;涵盖基本的语法和用法。 基本语法 DataWeave 脚本分为三个部分&#xff1a;%dw 声…

SpringBoot整合WebClient进行Http远程调用

使用WebClient进行Http远程调用 文章目录 使用WebClient进行Http远程调用1.WebClient对象创建2.WebClient对象抽取config配置3.Get请求url参数设置4.获取ResponseEntity对象5.Post请求测试示例代码 WebClient 一旦创建&#xff0c;就是不可修改的&#xff0c;如果需要设置默认值…