zoukankan      html  css  js  c++  java
  • Linux三剑客之awk

    组成

    awk  [options]  ‘BEGIN{  commands  }  pattern{  commands  }  END{  commands  }’ filename

      其中options表示awk的可选的命令行选项,最常用的就是-F。而后面的单引号里面的所有内容是awk的程序脚本,awk需要对文件每一行分割后的每一列做处理。filename是awk要处理的文件名

    实例:

    echo ’11 22 33 44’ | awk ‘{print $3” ”$2” ”$1}’

    输出:33 22 11

      其中省略了BEGIN块和END块,只剩下中间的程序,而且还省略了pattern部分,没有BEGIN和END表示中间的程序运行是针对所有行的。花括号里的空格必须用双引号括起来,不然输出的值会连在一起。

    echo –e ’11 22 33 44
    aa bb cc dd’ | awk ‘{print $3” ”$2” ”$1}’

    输出:

    33 22 11

    cc bb aa

    echo –e ‘1 2 3 4
    5 6 7 8’ |awk ‘$1>2{print $3” ”$2” ”$1}’

    输出:7 6 5

      其中没有省略pattern部分,这部分是条件,$1>2表示如果当前行的第一列大于2则处理当前行,否则不处理。

    echo –e ‘1 2 3 4
    5 6 7 8’ | awk ‘BEGIN{print “c1 c2 c3”;print “ ”} {print $3” ”$2” ”$1}’

    输出:

    c1 c2 c3

     

    3 2 1

    7 6 5

      其中BEGIN里的打印在开头,花括号里面可以有多条语句,使用分号隔开,print ” ”为空一行。

    echo –e ‘1
    2
    3’ | awk ‘BEGIN{print “begin”} {print $1} END{print “end”}’

    输出:

    begin

    1

    2

    3

    end

      其中END语句块是在程序处理完所有行后才执行的,且只执行一次。

    cat test.txt
    11 22 33
    23 45 34
    22 32 43
    awk ‘BEGIN{sum=0} {sum+=$1} END{print sum}’ test.txt

    输出结果:56

      其中在BEGIN中变量sum赋值为0,然后在循环语句中将每一行的第一列加到sum中,当所有的行处理完之后,打印出sum变量的值。这个例子中的BEGIN语句是可以省略的,可以直接在循环语句中使用sum变量,此时sum第一次使用,该变量会自动被建立,默认初始值为0。

    cat test.txt
    1 2 3
    4 5 6
    7 8 9
    10 11 12
    awk ‘{if($1%2==0)print $1” ”$2” ”$3}’ test.txt

    输出:

    4 5 6

    10 11 12

      其中处理第一列的值除以2余0的行。

    循环

    awk ‘BEGIN{count=0;while(count<5){print count;count++;}}’

    输出:

    0

    1

    2

    3

    4

    awk ‘BEGIN{count=0;do{print count;count++}while(count<5)}’

    输出:

    0

    1

    2

    3

    4

    awk ‘BEGIN{for(count=0;count<5;cout++)print count}’

    输出:

    0

    1

    2

    3

    4

    cat test.txt
    zhangsan 2 3
    lisi 5 6
    zhangsan 8 9
    lisi 11 12
    wangwu 33 11
    awk ‘{sum[$1]+=$2}END{for(k in sum)print k” ”sum[k]}’ test.txt

    输出:

    zhangsan 10

    lisi 16

    wangwu 33

      将所有第一列相同的分成一个组,并将该组中的第二列求和。

      这个例子里面使用了for..in循环来遍历数组的key,同时通过key来得到数组的值。对于key不是数字的数组,是不能通过普通的for循环来以数字索引访问数组元素的。可以同length()函数来获取数组的元素个数。

    a=22
    b=33
    awk –v x=$a –v y=$b ‘BEGIN{print x” ”y}’

    输出:

    22 33

      其中选项-v来指定变量。只能在awk的option部分引用shell变量,在awk的语句块中使用美元符号引用变量会被awk解析成自己的变量而不是shell变量。

    操作符与优先级

    1    =,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>= 
    2    || 
    3    &&
    4    |
    5    ^
    6    &
    7    ==,!=
    8    <=,>=,<,>
    9    <<,>>
    10    +,-
    11    *,/,%
    12    !,~
    13    -,+            正、负

    算术

    atan2(y,x)        返回y/x的反正切
    cos(x)        返回x的余弦;x是弧度
    sin(x)        返回x的正弦;x是弧度
    exp(x)        返回x幂函数
    log(x)        返回x的自然对数
    sqrt(x)        返回x平方根
    int(x)        返回x的截断至整数的值
    rand()        返回任意数字n,其中0 <= n < 1。
    srand([expr])    将rand函数的种子值设置为Expr参数的值,或如果省略Expr参数则使用某天的时间。返回先前的种子值。

    字符串

    gsub(reg,str1,str2)         使用str1替换所有str2中符合正则表达式reg的子串
    sub(reg,str1,str2)         含义与gsub相同,只不过gsub是替换所有匹配,sub只替换第一个匹配
    index(str,substr)         返回substr在str中第一次出现的索引,注意索引从1开始计算,如果没有则返回0
    length(str)             返回str字符串的长度,length函数还可以返回数组元素的个数
    blength(str)             返回字符串的字节数
    match(str,reg)         与index函数一样,只不过reg使用正则表达式,例如match("hello",/lo/)
    split(str,array,reg)        将str分隔成数组保存到array中,分隔使用正则reg,或者字符串都可以,返回数组长度
    tolower(str)             转换为小写
    toupper(str)             转换为大写
    substr(str,start,length)     截取字符串,从start索引开始的length个字符,如不指定length则截取到末尾,索引从1开始

    高级用法

    说明:[A][N][P][G]表示支持该变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
    $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。 
    $0 这个变量包含执行过程中当前行的文本内容。
    [N] ARGC 命令行参数的数目。
    [G] ARGIND 命令行中当前文件的位置(从0开始算)。
    [N] ARGV 包含命令行参数的数组。
    [G] CONVFMT 数字转换格式(默认值为%.6g)。
    [P] ENVIRON 环境变量关联数组。
    [N] ERRNO 最后一个系统错误的描述。
    [G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。
    [A] FILENAME 当前输入文件的名。
    [P] FNR 同NR,但相对于当前文件。
    [A] FS 字段分隔符(默认是任何空格)。
    [G] IGNORECASE 如果为真,则进行忽略大小写的匹配。
    [A] NF 表示字段数,在执行过程中对应于当前的字段数。
    [A] NR 表示记录数,在执行过程中对应于当前的行号。
    [A] OFMT 数字的输出格式(默认值是%.6g)。
    [A] OFS 输出字段分隔符(默认值是一个空格)。
    [A] ORS 输出记录分隔符(默认值是一个换行符)。
    [A] RS 记录分隔符(默认是一个换行符)。
    [N] RSTART 由match函数所匹配的字符串的第一个位置。
    [N] RLENGTH 由match函数所匹配的字符串的长度。
    [N] SUBSEP 数组下标分隔符(默认值是34)。

    其他

    system(command) 执行系统命令,返回退出码
    mktime( YYYY MM dd HH MM ss[ DST]) 生成时间格式
    strftime(format,timestamp) 格式化时间输出,将时间戳转换为时间字符串
    systime() 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数
    根据:空格 ,来分割
    #echo “a:b c,d” | awk –F “ |,|:” ‘{print $1;print $2;print NF}’
    a
    b
    4
    
    
    #awk ‘BEGIN{a=1;b=”213”;print “output ”a”,”b;}’
    output 1,213
    
    #awk ‘BEGIN{a=1;b=”213”;print “output”,a,”,”b;}’
    output 1 ,213
    
    #awk ‘BEGIN{a=1;b=”213”;printf(“output %d,%s
    ”,a,b)}’
    output 1,213
  • 相关阅读:
    BZOJ 3205 [Apio2013]机器人 ——斯坦纳树
    BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
    HDU 1423 Greatest Common Increasing Subsequence ——动态规划
    BZOJ 3309 DZY Loves Math ——莫比乌斯反演
    POJ 1038 Bugs Integrated, Inc. ——状压DP
    POJ 3693 Maximum repetition substring ——后缀数组
    POJ 2699 The Maximum Number of Strong Kings ——网络流
    POJ 2396 Budget ——有上下界的网络流
    BZOJ 4650 [Noi2016]优秀的拆分 ——后缀数组
    源码安装python
  • 原文地址:https://www.cnblogs.com/chy-op/p/9788029.html
Copyright © 2011-2022 走看看