博客園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;
這個後續在補充。。。