awk之getline
欲要瞭解getline,首先需要搞清楚$0,NR,FNR這幾個概念。
所謂NR可以理解成Number of Record,或者說是行號,而FNR可以理解為Number of Record in File,或者成為檔案內行號.聽起來沒啥區別。實際上如果你只有一個檔案要awk處理,NR和FNR就是一回事,如下面所示,同一個檔案bbs-list-3,對於每一行輸出的NR和FNR是相同的。
manu@manu:~/code/shell/awk$ cat bbs-list-3 aardvark 555-5553 1200/300 B alpo-net 555-3412 2400/1200/300 A barfly 555-7685 1200/300 A manu@manu:~/code/shell/awk$ awk '{printf "%-2d %-2d %s\n",NR,FNR,$0 }' bbs-list-3 1 1 aardvark 555-5553 1200/300 B 2 2 alpo-net 555-3412 2400/1200/300 A 3 3 barfly 555-7685 1200/300 A 但是如果你有多個檔案要處理,情況就不同了。NR不管你是位於那個檔案,每讀一行NR++,但是如果處理的檔案發生了變化,FNR從1開始重新計數,如所示:
Effective awk programming中,給出了個表格,將awk的用法總結了如下:
什麼意思呢,我們以幾個例子來講述getline的用法,以及解釋輸出為何是這樣:首先我們的基準檔案是:
1 getline
我們看下上面的table,getline會將得到的下一條record賦給$0,同時NR,FNR都會++。
2 getline var
這個對應的是table的第二條,getline var,會將取到的下一條record賦值給 var,NR++,FNR++,而$0不發生任何的變化。
看,每次取到下一條record,賦值給tmp,而$0,從未發生變化,因為getline var 這種模式,從不改變$0.
3 command | getline
表格裡面顯示,會影響$0,將執行command的結果賦值給$0,複製我們可以用下面的例子展示下:
4 command | getline var
這個不多說了,會將command的輸出賦值給var,而$0保持不變。