看了網上好多關于AWK內建變量的文章,這里加上個人的理解和記憶,可以讓大家掌握這些變量的基本用法。
FS 指定字段un列分隔符(Font Space)
1
2
3
4
|
[~/AWK_learning]$ echo "111|222|333" | awk '{print $1}' 111|222|333 [~/AWK_learning]$ echo "111|222|333" | awk 'BEGIN{FS="|"}{print $1}' 111 |
OFS 指定輸出字段列分隔符(Output Font space)
1
2
|
[~/AWK_learning]$ echo "111 222 333" |awk 'BEGIN{OFS="|";}{print $1,$2,$3}' 111|222|333 |
RS指定行分隔符 默認分隔符為\n(Row Space)
1
2
3
4
|
[~/AWK_learning]$ echo "111 222|333 444|555 666" | awk 'BEGIN{RS="|"}{print $0}' 111 222 333 444 555 666 |
ORS指定輸出行分隔符
1
2
|
[~/AWK_learning]$ awk 'BEGIN{ORS="|";}{print $0;}' test.txt 111 222|333 444|555 666 |
RT 代指分隔符
1
2
3
4
|
[~/AWK_learning]$ echo "111 222|333 444|555 666" | awk 'BEGIN{RS="|"}{print $0,RT}' 111 222 | 333 444 | 555 666 | |
NF 每行字段總數(Number of Font)
1
2
3
4
5
6
7
8
9
10
11
12
|
[~/AWK_learning]$ cat test.txt 111 222 333 444 555 666 [~/AWK_learning]$ awk '{print NF}' test.txt 2 2 2 [~/AWK_learning]$ awk '{print $NF}' test.txt 222 444 666 |
NR 當前行數(Number of Row)
1
2
3
4
5
6
7
8
9
10
11
12
|
[~/AWK_learning]$ cat test.txt 111 222 333 444 555 666 777 [~/AWK_learning]$ awk '{print NR}' test.txt 1 2 3 [~/AWK_learning]$ awk '{print $NR}' test.txt 111 444 777 |
下面我們在來看下,在內建變量執行中的相關問題:
NR表示從awk開始執行后,按照記錄分隔符讀取的數據次數,默認的記錄分隔符為換行符,因此默認的就是讀取的數據行數,NR可以理解為Number of Record的縮寫。
在awk處理多個輸入文件的時候,在處理完第一個文件后,NR并不會從1開始,而是繼續累加,因此就出現了FNR,每當處理一個新文件的時候,FNR就從1開始計數,FNR可以理解為File Number of Record。
NF表示目前的記錄被分割的字段的數目,NF可以理解為Number of Field。
下面以示例程序來進行說明,首先準備兩個輸入文件class1和class2,記錄了兩個班級的成績信息,內容分別如下所示:
1
2
3
4
5
6
7
|
CodingAnts@ubuntu:~/awk$ cat class1 zhaoyun 85 87 guanyu 87 88 liubei 90 86 CodingAnts@ubuntu:~/awk$ cat class2 caocao 92 87 90 guojia 99 96 92 |
現在要查看兩個班級的所有成績信息,并在每條信息前加上行號,則可以使用下面的awk指令;
1
2
3
4
5
6
|
CodingAnts@ubuntu:~/awk$ awk '{print NR,$0}' class1 class2 1 zhaoyun 85 87 2 guanyu 87 88 3 liubei 90 86 4 caocao 92 87 90 5 guojia 99 96 92 |
這里的行號就是通過NR來實現的,awk每讀取一條記錄,NR的值便加一。如果要求每個班級的行號從頭開始變化,則需要使用FNR來實現,如下:
1
2
3
4
5
6
|
CodingAnts@ubuntu:~/awk$ awk '{print FNR,$0}' class1 class2 1 zhaoyun 85 87 2 guanyu 87 88 3 liubei 90 86 1 caocao 92 87 90 2 guojia 99 96 92 |
原文鏈接:http://blog.csdn.net/cengineering/article/details/78529292