zoukankan      html  css  js  c++  java
  • awk用法

         目前虽然有很多工具可以代替awk,但是呢我还是认为awk还是非常重要,比如有时候load数据到hive,mysql发现数据有点问题,这样可以先对比文件和库中数据是否一致,这样awk就发挥用处了,还有从文本中统计一些简单的数据,awk可是信手拈来。在这也简单的介绍下awk的用法。

    awk命令格式与选项

    awk [options] 'script' var=value file(s) 
    awk [options] -f scriptfile var=value file(s)
    

    常用命令选项:

    -F fs 指定分隔符,可以是字符串和正则表达式

    -v var=value   赋值一个用户定义变量,将外部变量传递给

    awk -f scripfile  从脚本文件中读取awk命令

    -m[fr] val   对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

    awk基本结构

    awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
    

    这块主要是要理解执行原理,这块理解透彻了,对一个编程的人来说,就变得简单多了。

    第一步:执行BEGIN{ commands }语句块中的语句;

    第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。

    第三步:当读至输入流末尾时,执行END{ commands }语句块。

    BEGIN语句是在awk在读取文本之前被执行,是可选模块,一般是用来写变量初始化,打印表头等语句

    END语句是在awk读取文本之后被执行,也是可选模块,一般用来做所有行的汇总,如sum之类的。

    pattern 读取的文本的每一行,如果没有此模块,会默认打印读取的每一行。

    如下:

    echo "hello word"|awk 'BEGIN{print"beging--"}{print}END{print "end--"}'
    beging--
    hello word
    end--
    

    当不带参数的print,它会打印当前行,和print $0一样,print 打印后面用逗号,打印出结果已空格分离,awk中双引号是当做连接使用。

    echo|awk '{var="a";var1="b";print var,var1;}'
    a b
    

    awk 内置变量

    说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
    区分可以看这篇
    http://www.cnblogs.com/wujin/p/6073100.html

    $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)。

    举例说明几种常用的

    echo -e "test 1 2 
    test1 2 3 4"|awk '{print "记录数:"NR,"字段数:"NF,"$0="$0}'
    记录数:1 字段数:3 $0=test 1 2 
    记录数:2 字段数:4 $0=test1 2 3 4
    

    统计文中的行数:

    cho -e "test 1 2 
    test1 2 3 4"|awk 'END{print NR}'
    2
    

    使用NF可以打印出一行的最后一个

    echo -e "test 1 2 
    test1 2 3 4"|awk '{print $NF}'
    2
    4
    echo -e "test 1 2 
    test1 2 3 4"|awk '{print $NF-1}'
    1
    3
    

    有时候经常会被问到求和的算法

    原始数据

    a 10
    a 12
    b 13
    b 12
    a 14
    a 15
    a 13
    b 11
    a 16
    b 17
    a 14
    

    单独列求和和分组求和

    awk '{sum+=$2}END{print sum}' aa.txt 
    147
    awk '{s[$1]+=$2} END {for(i in s){print i,s[i]}}' aa.txt 
    a 94
    b 53
    

    awk接收外部变量

    echo|awk -v v1="a" '{print v1}'  
    a
    



     

     



  • 相关阅读:
    ElasticSearch 查询语法
    自定义的带tab的可左右滑动的viewpager之二viewpager与fragment不兼容
    QT5 串口收发实例代码
    Communications link failure报错的处理
    mac 环境下mysql 不能删除schema问题的解决办法
    [置顶] How to dump redo log entry?
    pjsip视频通信开发(上层应用)之拨号界面整体界面功能实现
    windows command ftp 中文文件名乱码解决方法
    (字符串的模式匹配4.7.18)POJ 2406 Power Strings(求一个字符串的最小重复串)
    通过程序 VB.Net 或 C# 读取文本文件行数
  • 原文地址:https://www.cnblogs.com/wujin/p/6073042.html
Copyright © 2011-2022 走看看