關於awk中NR、FNR、NF、$NF、FS、OFS的說明


一、NR和FNR
1.釋義
NR: 表示當前讀取的行數
FNR:當前修改了多少行


2.舉例
比如現在AWK處理到第五行。第一行沒有進行操作,2,3,4,5行進行了操作,那么NR=5,FNR=4
NR==FNR 表示從起始行到當前行,awk都進行了操作,比如修改,添加等等 ;

二、NF和$NF
1.釋義
NF:瀏覽記錄的域的個數
$NF: 最后一個列,輸出最后一個列的內容

2.舉例
[root@vshi-template shell]# pwd
/root/guanyy/scripts/shell
[root@vshi-template shell]# echo $PWD|awk -F/ '{print $NF}'
shell
[root@vshi-template shell]# echo $PWD|awk -F/ '{print NF}'
5

三、FS和OFS

1.釋義
FS:指定列分隔符, 當FS為空的時候,awk會把一行中的每個字符,當成一列來處理
OFS:列輸出分隔符


2.舉例
(1)FS指定列分隔符
  1. [zhangy@localhost test]$ echo "111|222|333"|awk '{print $1}'  
  2.  111|222|333  
  3. [zhangy@localhost test]$ echo "111|222|333"|awk 'BEGIN{FS="|"}{print $1}'  
  4.  111  
(2)FS也可以使用正則
  1. [zhangy@localhost test]$ echo "111||222|333"|awk 'BEGIN{FS="[|]+"}{print $1}'  
  2. 111  

(3)FS為空時
  1. [zhangy@localhost test]$ echo "111|222|333"|awk 'BEGIN{FS=""}{NF++;print $0}'  
  2. 1 1 1 | 2 2 2 | 3 3 3  
(4)RS被設定成非\n時,\n會成FS分割符中的一個
  1. [zhangy@localhost test]$ cat test1  
  2.  111 222  
  3.  333 444  
  4.  555 666  
  5. [zhangy@localhost test]$ awk 'BEGIN{RS="444";}{print $2,$3}' test1  
  6.  222 333  
  7.  666  
(5)OFS列輸出分隔符
  1. [zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $1,$2}' test1  
  2.  111|222  
  3.  333|444  
  4.  555|666  
  5. [zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $1 OFS $2}' test1  
  6.  111|222  
  7.  333|444  
  8.  555|666  
test1只有二列,如果100列,都寫出來太麻煩了吧。
  1. [zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $0}' test1  
  2.  111 222  
  3.  333 444  
  4.  555 666  
  5. [zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{NF=NF;print $0}' test1  
  6.  111|222  
  7.  333|444  
  8.  555|666  
為什么第二種方法中的OFS生效呢?個人覺得,awk覺查到列有所變化時,就會讓OFS生效,沒變化直接輸出了。

參考:http://blog.51yip.com/shell/1151.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM