blog
blog copied to clipboard
gawk 的变量与数组
trafficstars
变量
gawk 有一些内建的变量可以辅助使用者使用,使用者也可以自定义变量
内建变量
内建变量又分为分隔符变量 和 数据变量,分隔符变量重点是为了对输入和输出进行格式化处理
分隔符变量
分隔符变量包括:
- FIELDWIDTHS 由空格分隔开的定义每个输出数据字段确切宽度的一列数字
- FS 输入字段分隔符
- RS 输入数据航分隔符
- OFS 输出字段分隔符
- ORS 输出数据行分隔符
下文以下述文件为例:
root@host-1:/tmp# cat test.txt
Name:Zhangsan
Sex:Male
Age:22
-
FIELDWIDTHS 此参数主要用于取得每行的第 m ~ n 个字符
root@host-1:~# cat test.txt | gawk 'BEGIN{FIELDWIDTHS="3 2"}{print $1,$2}' Nam e: Sex :M Age :2 -
FS(输入字段分隔符)
仅拿第二列数据:
root@host-1:/tmp# cat test.txt | gawk 'BEGIN{FS=":"} {print $2}' Zhangsan Male 22我们设置了
FS分隔符为:,因此会把每一行数据根据 FS 的值进行分割扩展
如果我们设置了
FS="\n"会是什么结果?root@host-1:/tmp# cat test.txt | gawk 'BEGIN{FS="\n"} {print $1}' Name:Zhangsan Sex:Male Age:22因为我们对每一行使用
\n作为分隔符,所以输出了整行 -
RS(输入数据行分隔符)
这个输入数据行分隔符其实很迷惑人,我们可以这么认为:
在传给 gawk 的一段输入数据中,默认以每一行作为一个输入行传递给 gawk;如果我们设置了 RS,我们可以以多行作为一个输入行传递给 gawk
我们为
test.txt增加一份数据:root@host-1:/tmp# cat test.txt Name:Zhangsan Sex:Male Age:22 Name:Lisi Sex:Male Age:18现在,我们想要知道文件中所有人的名字:
root@host-1:/tmp# cat test.txt | gawk 'BEGIN{RS=""} {print $1}' Name:Zhangsan Name:Lisi我们设置了
RS="",以空白行作为输入行分隔符,因此 txt 文件中的两个人的所有属性分别会作为一个输入行传递给了 gawk -
OFS 与 ORS
我们以 test.txt 内容以下为例:
root@host-1:~# cat test.txt Name:Zhangsan Sex:Male Age:22目标:把
:换成-root@host-1:~# cat test.txt | gawk 'BEGIN{FS=":";OFS="-";ORS="\n"} {print $1,$2}' Name-Zhangsan Sex-Male Age-22解释:以
:作为字段分隔符,\n换行符作为输出行分隔符,-作为输出字段分隔符。
数据变量
自定义变量
数组
下列以数组的定义、遍历、删除来对数据进行说明