在awk中,如果呼叫next,那麼next之後的命令就都不執行了。此行文字的處理到此結束,開始讀取下一條記錄並操作。
例項如下:
- zoer@ubuntu:~$ cat data
- 1000
- naughty 500
- cc 400
- zoer 100
- zoer@ubuntu:~$ awk '{if(NR==1){next} print $1,$2}' data
- naughty 500
- cc 400
- zoer 100
比如說我們有一個data檔案,存放了每個人的出差費用。想要列印出來。但是第一行總費用不要列印。那麼使用awk的next忽略掉第一行即可。
-------------------------------------------------------------
與next相似,getline也是讀取下一行資料。但是與next不同的是,next讀取下一行之後,把控制權交給了awk指令碼的頂部。但是getline卻沒有改變指令碼的控制,讀取下一行之後,繼續執行當前的awk指令碼。getline執行之後,會覆蓋$0的內容。
例子如下:
- zoer@ubuntu:~$ cat data
- name naughty
- 25 shandong
- age 14
- hah,here is test
- zoer@ubuntu:~$ cat d
- $1=="name"{print $0;getline;print $0;}
- $1=="age"{print $0}
- zoer@ubuntu:~$ awk -f d data
- name naughty
- 25 shandong
- 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檔案的內容。