awk一點心得

   博客園awk高手衆多;在這裏是我的對awk的學習一點心得;同時也是awk的精妙之處;在此如有錯誤請你們指正,一塊兒來完善!html

  1. awk如何引入變量?有兩種方法      
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從總體上來講,應這麼理解它的用法:

  •  當其左右無重定向符 | 或 < 時,getline做用於當前文件,讀入當前文件的第一行給其後跟的變量var 或$0(無變量);應該注意到,因爲awk在處理getline以前已經讀入了一行,因此getline獲得的返回結果是隔行的。
  •  當其左右有重定向符 | 或 < 時,getline則做用於定向輸入文件,因爲該文件是剛打開,並無被 awk讀入一行,只是getline讀入,那麼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案例系列>用到比較多!

  • 數字0;
  • 空字符串;
  • 未定義的值;

 8. 去重;這個應該放到數組那邊的;

awk '!a[$0]++' inputfile

 【解析】:a[$0]開始是未定義的;因此是0;可是前面的!;表示該值是非0值;表達式是OK的;可是後面隨着a[$0]++;就反之

 9. 去除空行

awk 'NF' inputfile

【解析】空行的NF是爲0的;NF表示這行有多少個域;而空行是爲0;

 

這個後續在補充。。。

相關文章
相關標籤/搜索