博客园awk高手众多;在这里是我的对awk的学习一点心得;同时也是awk的精妙之处;在此如有错误请你们指正,一块儿来完善!html
1 awk -v var=$VAR '{code}' 2 awk '{print "'$VAR'"}'
例如测试:数组
1 [li0924@localhost awk]$ a=li0924 2 [li0924@localhost awk]$ echo fef| awk -v var=$a '{print var}' 3 li0924 4 [li0924@localhost awk]$ echo fef | awk '{print "'$a'"}' 5 li0924
2. 三目表达式(expr?values1:values2)函数
就是相似于C语言中的三目表达式:学习
例子用法暂时能够查考awk--round函数---http://www.cnblogs.com/lottu/archive/2013/06/10/3131400.html测试
3. 说道awk的精妙之处;不得不提数组spa
awk的数组是关联数组;下标但是数字和字符串;无需对数组名和元素提早声明;也不需指定元素的个数;因此awk的数组使用的很是灵活;这个在咱们以后《awk案例系列》会用到不少;code
读取数组值htm
1 #输出的顺序是随机的;可是到了awk4以后的版本这种写法是排好序的 2 for(item in array) 3 { 4 print array[item] 5 } 6 #输出的结果是是排好序的 7 for(i=1;i<=len;i++) 8 { 9 print array[i] 10 }
删除数组或数组元素blog
delete array; 删除整个数组
delete array[item];删除某个数组元素
4. awk输入命令getline字符串
这个函数我理解好久明白;
getline为awk所提供的输入命令
若是找到一条记录则getline返回1,若是到了文件结束(EOF)则返回0,若是错误则返回-1
A.getline从总体上来讲,应这么理解它的用法:
B.getline用法大体可分为三大类(每大类又分两小类),即总共有6种用法。代码以下:
QUOTE:
awk ‘BEGIN{“cat data.txt”|getline d; print d}’ data2.txt
awk ‘BEGIN{“cat data.txt”|getline; print $0}’ data2.txt $0能够省略
awk ‘BEGIN{getline d < “data.txt”; print d}’ data2.txt
awk ‘BEGIN{getline < “data.txt”; print $0}’ data2.txt
技巧1:取偶数行;取奇数行
[li0924@localhost awk]$ seq 10 | awk '{getline; print}' 2 4 6 8 10 [li0924@localhost awk]$ seq 10 | awk '{getline d; print}' 1 3 5 7 9
技巧2:两两互换(奇/偶互换)
[li0924@localhost ~]$ seq 10 | awk '{if(getline d) print d;print}' 2 1 4 3 6 5 8 7 10 9
固然你取奇数行/偶数行方法确实不少;不必定说要用getline函数;你能够是用NR%2这样能够取得奇数行;NR%2==0这样能够取到偶数行!在此就不累赘了!
5. 当咱们想以固定的长度来分割列时;这时候须要使用到内置变量FIELDWIDTHS;
[li0924@localhost ~]$ echo "123456789" | awk 'BEGIN{FIELDWIDTHS="2 3 5"}{print $3,$2,$1}' 6789 345 12
$1的长度是2;那么它就是12;$2的长度是3;那么不它就是345;输出的$3;就是6以后面的;
6. OFS为何有时候它不起做用呢:
例如须要把输出分隔符改成“|”
[li0924@localhost awk]$ cat a.txt WINGS 1000 4000 3 3/20_505 WINGS 5000 6000 8 8/20_505 SANLY 2000 4000 9 9/20_505 TINAG 8000 10000 11 11/20_505 [li0924@localhost awk]$ awk 'BEGIN{OFS="|"}{print}' a.txt WINGS 1000 4000 3 3/20_505 WINGS 5000 6000 8 8/20_505 SANLY 2000 4000 9 9/20_505 TINAG 8000 10000 11 11/20_505
由上咱们能够看出OFS并无生效!那要怎么样使它生效呢?这里咱们须要“欺骗”下文件;对文件咱们作了什么!
[li0924@localhost awk]$ awk 'BEGIN{OFS="|"}{$1=$1;print}' a.txt WINGS|1000|4000|3|3/20_505 WINGS|5000|6000|8|8/20_505 SANLY|2000|4000|9|9/20_505 TINAG|8000|10000|11|11/20_505
在此你能够把"$1=$1";换成$NF=$NF或$NF+=0均可以!大家能够测试下!
7. awk为假的状况?这个比较重要了;在之后的<awk案例系列>用到比较多!
8. 去重;这个应该放到数组那边的;
awk '!a[$0]++' inputfile
【解析】:a[$0]开始是未定义的;因此是0;可是前面的!;表示该值是非0值;表达式是OK的;可是后面随着a[$0]++;就反之
9. 去除空行
awk 'NF' inputfile
【解析】空行的NF是为0的;NF表示这行有多少个域;而空行是为0;
这个后续在补充。。。