awk快速学习

来源:互联网 发布:顶尖数据恢复 编辑:程序博客网 时间:2024/05/04 10:50

         一直久仰awk的大名,但一直没有学习,果然是要用的时候学习起来会比较快。答应了帮人写个小程序,就快速学习了下。 
         首先不知道如何入手,我先看看语法吧。 看电子书:《I love awk》熟悉下语法 。awk最牛逼的就是处理数据,如果能像数据库一样select group啊什么的,就好了,于是我参考了这篇文章: http://blog.csdn.net/sunny5211/article/details/8507020
         再说我遇到的一个个问题,我如何解决的。
1、如何使用文件来写脚本,因为在命令行里要敲一大坨不方便调试。所以有这个想法。
         awk -f xxx.awk a
      // a文件是要分析的文件,xxx.awk就是awk的具体脚本。 

2、如何设置分隔符,万恶的分隔符!!!

            如果在命令行里就写 awk -F“ ” 这里表示以空格为分隔符

            如果 是“\t”分隔符就写 awk -F"\t"

            ps:注意空格分隔符和制表符\t是两种不同的分隔,一定要注意!!!姐可是被这玩意儿害惨了的!

           如果在xxx.awk分析文件里就写BEGIN{FS="\t"} 

3、一种牛b的判断重复行的写法 比如数据格式如下:

            第一列是id 第二列是name 第三列是选课 

1 jerry aa1 jerry bb 2 kimi aa 2 kimi cc 3 jimmy bb 

          比如我要统计有几个人

                     {if(!a[$1]++){x++;}} 这个非的表示用的十分巧妙! 

          比如我要统计每个人选了几门课 

                    {b[$1]++;}

 4、如何定义函数 

          和c一样 直接定义 function a(){ ...... return xx; } 

5、如何在代码里使用正则?

           if(x ~/^[1,3]0[0-9][0-9][0-9]/){......} ~符号表示匹配 x为一个变量 ^[1,3]表示以开头 

6、内置函数的使用 split() 我这么用了一下: 

  

string="1|2|3|4|5"; split(string,array,/\|/); for(i=1;i<=5;i++) { if(x==array[i]) {return "1";} } 

 7、遍历数组可以,注意数组从1的下标开始的。和c有点不一样。

           

for(i in a){print a[i];}for(i=1;i<=length(a);i++){print a[i];}


8、如何同时处理两个文件 比如a文件 和b文件

a文件

1 a 102 b 203 c 30
b文件

1 xxx2 yyy3 zzz

想拼接成c文件该如何拼

1 a 10 xxx2 b 20 yyy3 c 30 zzz

一句话 就可以搞定,NR==FNR表示在处理b文件,后面的{}表示处理b文件执行的动作;NR>FNR表示在处理a文件后面的{}表示处理a文件执行的动作。

awk '{NR==FNR{a[$1]=$2;}NR>FNR{print{ $0,a[$1]}}}'  b a


9、打印文件倒数第三列的和