• awk进阶


    整理的awk的小技巧

    begin是要放在正则前面的,按照这个顺序:

    awk 'begin{} /.*?/ {action}end{}' file

    FS=':' 和 -F: 是等同的

    -F 表示以 XX为分隔符,那如果想要多个分隔呢?看实例:

    $ cat tmp
    ss>asdasd>hehe>asd
    where are you are my
    where are> you> are my
    
    $ awk -F '(>|are)' '{print $3}' tmp
    hehe
     my
     you

    可以看到,这里的分隔符是 >  或者是 are ,通过第3个例子可以发现,只要句子中出现这两个词,都会作为分隔,所以才出现了you 。


    for循环和便利数组,

    for(i=0;i<10;i++)print i,ENVIRON[i] 

    或者

     for(i in ARGV){print i,ARGV[i]}

    匹配正则表达式

    if(a ~ /^100*/)

    不匹配

    if(a ~! /^100*/)

    多文件操作,重点学习一下:

    dahu@dahu-OptiPlex-3046:~/myfile$ awk 'FNR==1{print "
    "FILENAME}{print $0}' a.txt b.txt  

    a.txt
    100 wang man
    200 wangsan woman
    300 wangming man
    400 wangzheng man

    b.txt
    100 90 80
    200 80 70
    300 60 50
    400 70 20

    看下回显信息,FNR==1相当于一个条件用法,在第一行显示文件名,这个用法可以。类似的,我可以第二行/第三行显示

    dahu@dahu-OptiPlex-3046:~/myfile$ awk 'BEGIN{info="it is a test";tlen=split(info,a," ");for(i in a){print tlen,i"	"a[i]};}'

    这句话tlen=split(info,a," "),tlen=4,因为分割成4个部分了,类似于len的用法

    dahu@dahu-OptiPlex-3046:~/myfile$ awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}'

    删除数组键值的方法,直接delete

    二维数组的用法:

    awk 'BEGIN{print">>>>>";
    for(i=1;i<=2;i++)
    {
      for(j=1;j<=5;j++)  
      {
    tarr[i,j]=i*j;
      }
    }
    for(m in tarr)              
    {
    
    split(m,tarr2,SUBSEP);             #split(数据源,新的数组,分割符)
    print tarr2[1],"*",tarr2[2],"=",tarr[m];   #二维数组从刚生成的新数组里面获取
    }
    }'

     显示文件的内容按照排序来显示

    dahu@dahu-OptiPlex-3046:~/myfile$ cat b.txt | sort -nk3

     两文件合并,借助next实现

    [chengmo@centos5 shell]$  cat a.txt b.txt | sort -n -k1 |awk  'NR%2==1{fd1=$2"	"$3;next}{print $0"	"fd1}' 

    也可以直接编程来实现:

    awk '
    BEGIN{print ">>>>>
    connect a.txt & b.txt";
    if(ARGC<3)
    {
      exit 1;
    } 
    file="";
    }
    {
    aData[FILENAME,$1]=ARGV[1]==FILENAME?$0:$2"	"$3;      #条件判断式,要么整行,要么第二行第三行,和文件名对应
    }
    END{
    for(k in aData)
    {
        split(k,idx,SUBSEP);                    #idx是aData的下标,k就是FILENAME和idx[2]
        if (idx[1]==ARGV[1] && (ARGV[2],idx[2])in aData)
        {
            print aData[ARGV[1],idx[2]],aData[ARGV[2],idx[2]] | "sort -nrk1"   #这里要加上引号的??
        }
    }
    }' a.txt b.txt

    awk正则表达式

    • awk内置使用正则表达式函数

    gsub( Ere, Repl, [ In ] )

    sub( Ere, Repl, [ In ] )

    match( String, Ere )

    split( String, A, [Ere] )

     EPRs类型。一些结合类型表示符没有了:包括:”d,D,s,S, ,v, ,f, ”

    常用: /[0-9]+/

    常用内置函数

    gsub,sub使用  sub是只替换第一个,gsub是全部替换,函数返回值是替换的个数
    [chengmo@centos5
    ~]$ awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' this is a test!test! 在 info中查找满足正则表达式,/[0-9]+/ 用””替换,并且替换后的值,赋值给info 未给info值,默认是$0 查找字符串(index使用) [wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' ok 未找到,返回0 正则表达式匹配查找(match使用) [wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' ok 截取字符串(substr使用) [wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' s is a tes 从第 4个 字符开始,截取10个长度字符串 字符串分割(split使用) [chengmo@centos5 ~]$ awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' 4 4 test 1 this 2 is 3 a 分割info,动态创建数组tA,这里比较有意思,awk forin 循环,是一个无序的循环。 并不是从数组下标1…n ,因此使用时候需要注意。

    getline:awk里,从文件中读取变量到awk中

    dahu@dahu-OptiPlex-3046:~/myfile$ awk 'BEGIN{while("cat car"|getline){print $1;};close("/car")}'

    或者

    dahu@dahu-OptiPlex-3046:~/myfile$ awk 'BEGIN{while(getline < "car"){print $1;};close("car")}'

    这样就可以实现获取本地文件的功能了

    同样的,也可以在脚本里面讲数据写入文件: 

    awk 'BEGIN{print "hehe"}' > hehe.txt

    简单快速数字转汉字:

    $ awk 'BEGIN{ORS="";a="零一二三四五六七八九";for(i=0;i<10;i++){arr[i]=substr(a,i+1,1)};b=345;for(j=1;j<=length(b);j++)
    {c=substr(b,j,1);print arr[c]};print " " }
    ' 三四五

    也可以处理文件

    $ awk 'BEGIN{ORS="";a="零一二三四五六七八九";for(i=0;i<10;i++){arr[i]=substr(a,i+1,1)}} 
    {for(j=1;j<=length($0);j++){c=substr($0,j,1);print arr[c]};print "
    "  }'  text
    一三四
    一三五
    一三六
    一三七
  • 相关阅读:
    跟我学Makefile(七)
    C++单例模式
    乘法逆元及求法
    推荐几个jetbrains全家桶好用的插件,同时作为备忘
    win32 获取本机网卡信息(MAC地址,IP地址等)
    centos7 安装 mysql-python时 报错 EnvironmentError: mysql_config not found
    VS2013 中使用 CxImage 库时用Unicode编码时出现链接错误
    剑指offer-二叉搜索树的后序遍历序列
    剑指offer-顺时针打印矩阵
    剑指offer-二叉树的镜像
  • 原文地址:https://www.cnblogs.com/dahu-daqing/p/6639051.html
Copyright © 2020-2023  润新知