awk中next以及getline用法示例

foreverfriends發表於2017-04-18

在awk中,如果呼叫next,那麼next之後的命令就都不執行了。此行文字的處理到此結束,開始讀取下一條記錄並操作。

例項如下:

[plain] view plain copy
  1. zoer@ubuntu:~$ cat data   
  2. 1000  
  3. naughty 500  
  4. cc 400  
  5. zoer 100  
  6. zoer@ubuntu:~$ awk '{if(NR==1){next} print $1,$2}' data   
  7. naughty 500  
  8. cc 400  
  9. zoer 100  

比如說我們有一個data檔案,存放了每個人的出差費用。想要列印出來。但是第一行總費用不要列印。那麼使用awk的next忽略掉第一行即可。

-------------------------------------------------------------

與next相似,getline也是讀取下一行資料。但是與next不同的是,next讀取下一行之後,把控制權交給了awk指令碼的頂部。但是getline卻沒有改變指令碼的控制,讀取下一行之後,繼續執行當前的awk指令碼。getline執行之後,會覆蓋$0的內容。

例子如下:

[plain] view plain copy
  1. zoer@ubuntu:~$ cat data   
  2. name naughty  
  3. 25 shandong  
  4. age 14  
  5. hah,here is test  
  6. zoer@ubuntu:~$ cat d  
  7. $1=="name"{print $0;getline;print $0;}  
  8. $1=="age"{print $0}  
  9. zoer@ubuntu:~$ awk -f d data   
  10. name naughty  
  11. 25 shandong  
  12. age 14  

例子中,如果遇到行首是name的,就把下一行讀取出來並列印。如果行首是age,就僅僅列印本行。

從執行結果也可以看出來,hah,here is test並沒有列印出來。因為它沒有匹配name或者age開頭。

---------------------------------------------------------------

除了讀取本文間的 下一行,getline還能夠讀取其他檔案。

下面例子中,每次讀取一行data檔案,就讀取testdata檔案並列印出來。【這個功能可以使用sed的r命令來實現,參考這裡

【存在疑問】

zoer@ubuntu:~$ awk '{print $0;while((getline<"testdata")>0)print $0;}' data
test line 1
1
2
test line 2
test line 3
zoer@ubuntu:~$ cat data 
test line 1
test line 2
test line 3
zoer@ubuntu:~$ cat testdata 
1
2
幫忙看下這個awk的使用,我想每次從data讀取一行列印出來,然後讀取testdata的全部列印出來。
然後重複這個過程。請問,為什麼testdata的內容只列印了一次??

這裡是因為,getline函式,讀取testdata檔案的時候,處理data檔案第一行的時候,testdata檔案的檔案指標就指向檔案末尾了。以後每處理一行data檔案,getline函式的返回值都是0。所以不再輸出testdata檔案的內容。

相關文章