C+Steve的作業......(嘆氣
寫完他的作業我深深地覺得,不是我不會寫,是我看不懂他的英文..
總之就是個awk的筆記跟簡易的教學,
這篇文章並不能讓你馬上會用awk,
但是可以提供給你許多必要的關鍵字讓你不用GOOGLE到手抽筋..

 

 

 基本語法網頁:

http://www.grymoire.com/Unix/Awk.html

這網站非常棒 ,該有的用法跟關鍵字都有,
反而是我平常查詢Linux相關的常去的鳥哥網站,
裡面的awk介紹只有一個囧字

 

我的AWK心得:
AWK會把資料以行為單位讀進來,
並且將資料(以空白orTAB)分成一個欄位一個欄位方便處理,
$0代表一整行,$1~$N代表1~N個欄位
例如說:如果資料是

A B C
1 2

讀取第一行的時候,$0=="A B C" $1=="A" $2=="B" $3=="C"
讀取第二行的時候,$0=="1 2" $1==1 $2==2


這語言其實跟C++概念不會差太多,
重點就一開始先掌握幾個特定變數的意義,
例如說FS 代表指定分隔欄位用的字元(預設空白跟TAB),RS代表分隔每筆資料用的字元(預設換行)
NF代表目前這筆資料有幾個欄位,NR代表目前是第幾筆資料

awk程式碼基本架構 XXX{}
XXX代表條件,{}裡面則是要執行的動作,
請注意,這裡有個地方跟C++有很大的不同 

XXX跟{必須擺在同一行, 也就是說

XXX
{

 ....

並不合法,一定要寫成

 

XXX{

 ....

才可 

當然你要寫XXX{}也是可以的 

詳細例子看CODE應該就懂了,看不懂的話就去翻我丟的那個網站吧 
喔對,有兩個特殊的條件 BEGIN跟END,
可以指定在程式一開始,跟結束前分別要作啥動作

還有幾個好用的工具:

1.關聯式陣列
類似C++ STL的MAP,可以直接使用

2.split($0,t," ")
把$0的資料以空白當作分割存入t陣列

3. match($0,"::")
傳回$0裡面符合"::"的位址
"::" 可用正規表示法
例如說match($0,/[0-9]/)

4. printf
跟C的用法完全一樣,感動T﹍T

5. length($0)
傳回字串長度

6.substr($0,1,2)
把字串$0從第一個字開始切兩個出來,字串index從1開始算
也就是說,如果$0=="ABC"的話 substr($0,1,2)會回傳 "AB"

以下是參考程式碼,抓FU用~

 

#!/usr/bin/awk -f
NR==1{
  FS="[[{:;]";
  if(match($1,/^G/))key=1;
  else key=0;
}

NR>1 && match($0,"::")>0{
  ger=$1;
  if(substr(ger,length(ger),1)==" ")ger=substr(ger,1,length(ger)-1);

  for(i=0;1;i++)if($(i)=="")break;
  eng=substr($(i+1),2,length($(i+1)));
  if(substr(eng,length(eng),1)==" ")eng=substr(eng,1,length(eng)-1);

  if(key==1 && map[ger]==0)map[ger]=eng;
  else if(key==0 && map[eng]==0)map[eng]=ger;

}
NR>6 && match($0,"::")==0{
  split($0,t," ");
  printf("%s ",t[1]);
  for(i=2;t[i]!="";i++)
  {
  if(map[t[i]]!="")
  printf("%s ",map[t[i]]);
  else
  printf("%s ",t[i]);
  }
  printf("\n");
}

smartPG 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • 訪客
  • 感謝分享,受益良多...