• 【转】你不了解的awk


    pattern的细化

    首先说下BEGIN和END之间的多个模式的执行顺序,我写了下面的程序来验证下:

    1. image

    图1 多个模式的执行顺序验证(数据文件为cars)

    如上图,BEGIN,END中间有三个模式,缺省模式,判断出厂时间($3>2000),判断品牌($1 ~ /ford/),运行结果如下:

    image

    图2 运行结果

    可见,对数据文件中的一条记录,gawk的多个文件是依次匹配的。

    · pattern中用到的语法和运算符:

    1、正则表达式

    如图1中看到的,用 / / 将正则表达式括起来,即可将该表达式作为模式使用:

    单独的“ /ford/ ” 表示用该表达式匹配整个记录

    也可以至少用“ ~ ”,如“$1 ~ /ford/”,表示指定字段作为匹配对象,匹配对象可以是字段,也可以使变量。

    “!~ ”表示不满足匹配。

    2、关系操作符

    可以使用<,<=,==,!=,>=,> 等关系操作符进行数值和字符串比较

    3、布尔运算符

    可以使用 ||(OR)和&&(AND)来组合任何模式

    · 特殊符号

    (逗号)

    范围操作符 如果一个gawk程序行上用逗号将两个模式隔开,

    gawk选取从匹配第1个模式的第1行开始的文本行。

    gawk选取的最后一行是匹配第2个模式的那行紧接着的下一行文本。如果没有匹配第2个模式的文本航,gawk将选取知道输入末尾的所有文本行。

    在gawk找到第2个模式之后,它将再次查找第1个模式以再次开始这个过程。

    eg.

    image

    图3 cars数据文件

    image

    图4 逗号算符示例1

    image

    图5 逗号算符示例2

    看示例1,“awk '/volvo/,/bmw/' cars”, 先匹配/volvo/,从第4行开始,匹配成功,然后要匹配/bmw/,到第7行。然后,重新开始匹配/volvo/,找不到,到文件末尾,结束。

    示例2,“awk '/chevy/,/ford/' cars”,先匹配/chevy/,从第一行开始,匹配成功,然后匹配/ford/,第一组取到2、3行数据,又从/chevy/开始,虽然cars中第5行为ford,但是现在匹配的是/chevy/,所以被跳过了。可见,逗号分隔的两个匹配,是有先后顺序的。

    > 几个特殊符号

    单引号'

    在命令行上创建的gawk程序中间包含空格或特殊的shell字符,则必须用单引号将程序括起来。

    gawk写在shell文件中时:

    单引号用来从shell中获取变量值

    image

    image

    图6 单引号示例

    双引号"

    使用了双引号,gawk将进行正文比较,即使用ASCII排序序列作为比较基础

    image

    图7 双引号示例

    如果是进行数值比较,则不用双引号

    image

    图8 数值比较

  • 相关阅读:
    ACM: HDU 2544 最短路-Dijkstra算法
    ACM: HDU 1874 畅通工程续-Dijkstra算法
    ACM: SGU 101 Domino- 欧拉回路-并查集
    ACM: HDU 1285 确定比赛名次
    ACM: hdu 2647 Reward -拓扑排序
    ACM: hdu 1811 Rank of Tetris
    ACM: poj 1094 Sorting It All Out
    ACM: hihicoder #1174 : 拓扑排序·一 STL- queue
    ACM: CodeForces 140A New Year Table-数学几何
    POJ 3122 Pie 二分枚举
  • 原文地址:https://www.cnblogs.com/pmars/p/2845965.html
Copyright © 2020-2023  润新知