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保持不變。