blog icon indicating copy to clipboard operation
blog copied to clipboard

gawk 的变量与数组

Open penglongli opened this issue 7 years ago • 0 comments
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 换行符作为输出行分隔符,- 作为输出字段分隔符。

数据变量

自定义变量

数组

下列以数组的定义、遍历、删除来对数据进行说明

定义数组

遍历数组

删除元素

penglongli avatar Feb 06 '18 15:02 penglongli