一直久仰awk的大名,但一直没有学习,果然是要用的时候学习起来会比较快。答应了帮人写个小程序,就快速学习了下。
首先不知道如何入手,我先看看语法吧。 看电子书:《I love awk》熟悉下语法 。awk最牛逼的就是处理数据,如果能像数据库一样select group啊什么的,就好了,于是我参考了这篇文章: http://blog.youkuaiyun.com/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 aa
1 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 10
2 b 20
3 c 30b文件
1 xxx
2 yyy
3 zzz想拼接成c文件该如何拼
1 a 10 xxx
2 b 20 yyy
3 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、打印文件倒数第三列的和
1833

被折叠的 条评论
为什么被折叠?



