• awk从放弃到入门(3):awk变量


    一、变量概述

      对于awk来说"变量"又分为"内置变量" 和 "自定义变量" , "输入分隔符FS"和"输出分隔符OFS"都属于内置变量。内置变量就是awk预定义好的、内置在awk内部的变量,而自定义变量就是用户定义的变量。

    awk常用的内置变量以及其作用如下:

    FS:输入字段分隔符, 默认为空格

    OFS:输出字段分隔符, 默认为空格

    RS:输入记录分隔符(输入换行符), 指定输入时的换行符,默认为换行符

    ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符,默认为换行符

    NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量

    NR:行号,当前处理的文本行的行号。

    FNR:各文件分别计数的行号

    FILENAME:当前文件名

    ARGC:命令行参数的个数

    ARGV:数组,保存的是命令行所给定的各参数

    二、内置变量

      2.1内置变量NR

      内置变量NR表示每一行的行号,内置变量NF表示每一行中一共有几列,那么,也就是说,我们可以通过下例中的方法,得到t1.txt文本中,每一行的行号以及每一行对应的列的数量。

    【注意】细心如你一定注意到了一个细节,就是在打印 $0 , $1 , $2 这些内置变量的时候,都有使用到"$"符号,但是在调用 NR , NF 这些内置变量的时候,就没有使用"$",如果你有点不习惯,那么可能是因为你已经习惯了使用bash的语法去使用变量,在bash中,我们在引用变量时,都会使用$符进行引用,但是在awk中,只有在引用$0、$1等内置变量的值的时候才会用到"$",引用其他变量时,不管是内置变量,还是自定义变量,都不使用"$",而是直接使用变量名。

      2.2内置变量FNR

      当我们使用awk同时处理多个文件,并且使用NR显示行号的时候,效果如下图。

    如果使用NR参数,会将两个文本文件看成一个文件来显示(计数)行号;如果使用FNR参数,就会将两个文本文件分别显示(计数)行号。效果如下:

       2.3内置变量RS

      RS是输入行分隔符,如果不指定,默认的"行分隔符"就是我们所理解的"回车换行"。

    假设,我们不想以默认的"回车换行"作为"行分隔符",而是想使用空格作为所谓的行分隔符,也就是说,我们想让awk认为,每遇到一个空格,就换行,换句话说,我们想让awk以为每次遇到一个空格就是新的一行(其它案例:让awk以为每次遇到一个#就是新的一行)。那么我们该怎么做呢?示例如下:

    awk思维:只要遇到空格就是新的一行,否则属于同一行。

    所以图中第5行才会出现这种情况。awk认为Jack就是第5行。

      2.4内置变量ORS

      现在,我们改变一下awk的想法,我们让awk认为,"**"才是真正的输出行分隔符,示例如下图:

    在没有指定输出行分隔符之前,awk跟人类的逻辑思维是一样一样的,当人类想要换行的时候,就会"另起一行"(回车换行),awk也是一样的,当它在输出文字的时候,如果想要换行,就会"另起一行"(回车换行), 可是,如果我们指定了"输出行分隔符"为"**",那么,当awk在输出文字的时候,如果想要换行,就会"另起一行"(**),所以,对于awk来说,它完成了"另起一行"的动作,只不过,它所认为的"另起一行"的动作就是输出"**",而不再是原来的输出" 回车换行",所以,从人类看到的"表象上",awk并没有换行,那是因为我们还是以"回车换行"作为换行的标准,而awk已经变了,它认为,"**"就是换行的标准。

     把"输入换行符"和"输出换行符"同时使用,看看是什么效果,示例如下:

      2.5内置变量FILENAME

      FILENAME这个内置变量,从字面上,就能看出是什么意思,没错,就是显示文件名,演示效果如下:

      2.6内置变量ARGV和ARGC

      ARGV内置变量表示的是一个数组,这个数组中保存的是命令行所给定的参数。这样解释还是很模糊,不容易理解,我们来看看示例:

    先使用BEGIN模式,输出一个字符串"aaa",然后,传入两个文件的文件名作为参数,我们发现,BEGIN模式正常执行了打印操作,输出了"aaa"字符串 ,我们使用同样的命令,同样使用BEGIN模式,只不过,这次不只打印"aaa",还打印ARGV这个数组中的第二个元素的值。

     ARGV内置变量表示的是一个数组,既然是数组,就需要用上图中的下标的方式,引用对应元素的值,因为数组的索引都是从0开始的,所以,ARGV[1]表示引用ARGV数组中的第二个元素的值,从返回结果可以看出,ARGV[1]对应的值为t1.txt,同理,我们又使用第三条命令,多打印了一个ARGV[2]的值,发现ARGV[2]对应的值为t2.txt,这个时候,你明白ARGV内置变量的含义了吗,说白了,ARGV内置变量表示的是:所有参数组成的数组。那么细心的你一定会问了,ARGV[0]对应的是哪个参数呢,我们来打印一下:

    awk就是这么规定的,'pattern{ action }'并不被看做是参数,awk被看做为参数。

    在刚才的例子中,应该有三个参数,awk、t1.txt、t2.txt,这三个参数作为数组的元素存放于ARGV中,现在,而ARGC则表示参数的数量,也可以理解为ARGV数组的长度。示例如下:

    三、自定义变量

      方法一:-v varname=value  变量名区分字符大小写。

      方法二:在program中直接定义。

      3.1通过方法一自定义变量

      3.2通过方式二自定义变量

      直接在program中定义即可,但是注意,变量定义与动作之间需要用分号";"隔开。

       当我们需要在awk中引用shell中的变量的时候,则可以通过方法一间接的引用。举例如下:

    【参考文章:http://www.zsythink.net/archives/1374】

  • 相关阅读:
    使用JFileChooser实现在指定文件夹下批量添加根据“数字型样式”或“非数字型样式”命令的文件夹
    51Nod 1376 最长递增子序列的数量 (DP+BIT)
    POJ 2728 Desert King (最优比率树)
    UVa 11280 Flying to Fredericton (DP + Dijkstra)
    UVa 11367 Full Tank? (DP + Dijkstra)
    UVa 10269 Adventure of Super Mario (Floyd + DP + BFS)
    UVaLive 4452 The Ministers' Major Mess (TwoSat)
    UVa 11294 Wedding (TwoSat)
    HDU 3247 Resource Archiver (AC自动机+BFS+状压DP)
    HDU 5957 Query on a graph (拓扑 + bfs序 + 树剖 + 线段树)
  • 原文地址:https://www.cnblogs.com/python-wen/p/10787433.html
Copyright © 2020-2023  润新知