awk进行文本处理
1 awk的內置變量
awk?所內建的字段變量及其涵意如下?:
| 字段變量 | 含義 |
| $0 | 一字符串,?其內容為目前?awk?所讀入的數據行. |
| $1 | $0?上第一個字段的數據. |
| $2 | $0?上第二個字段的數據. |
| ... | 其余類推 |
| 內建變量 | 含義 |
| NF (Number of Fields) | 為一整數,?其值表$0上所存在的字段數目. |
| NR (Number of Records) | 為一整數,?其值表awk已讀入的數據行數目. |
| FILENAME | 正在處理的數據文件文件名. |
[dss@localhost ~]$ awk 'NR==1,NR==10 {print NR,$1,$3,$4,$5,$6,$7,$8,$9}' firewallb-week2-origin.sql 1 1 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013 2 2 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014 3 3 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014 4 4 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013 5 5 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014 6 6 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014 7 7 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013 8 8 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013 9 9 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013 10 10 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014 [dss@localhost ~]$ 例如 : awk 從文件 firewallb-week2-origin.sql中讀入第一到第十行數據
$0 是一行的數據
NR是行號
$3是07:02:35
FILENAME是firewallb-week2-origin.sql
例如 : awk 從文件 firewallb-week2-origin.sql中讀入第一到第十行數據并輸出到aa.txt
[dss@localhost ~]$ awk 'NR==1,NR==10 {print NR,$1,$3,$4,$5,$6,$7,$8,$9}' firewallb-week2-origin.sql >aa.txt [dss@localhost ~]$ cat aa.txt 1 1 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013 2 2 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014 3 3 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014 4 4 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013 5 5 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014 6 6 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014 7 7 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013 8 8 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013 9 9 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Built ASA-6-302013 10 10 07:02:35 10/Apr/2013 07:02:35 1365577355 Info Teardown ASA-6-302014 [dss@localhost ~]$
2. 工作流程?:
執(zhí)行awk時,?它會反復進行下列四步驟.
awk會自動重復進行上述4個步驟,?使用者不須于程序中編寫這個循環(huán)?(Loop).
3.使用
兩種方式:
a. $ awk -f awk程序文件名 數據文件文件名
? ? $ awk -f aa.awk aa.txt (-f 表示指定awk程序文件)
b. $ awk '{ print $2, $3 * $4 }' aa.txt
[dss@localhost ~]$ awk '{ print $2, $1 * $2,$8 }' aa.txt 1 1 Built 2 4 Teardown 3 9 Teardown 4 16 Built 5 25 Teardown 6 36 Teardown 7 49 Built 8 64 Built 9 81 Built 10 100 Teardown
[dss@localhost ~]$ awk '{ printf("%6s 乘法:%3d name:%6s\n", $2, $1 * $2,$8) }' aa.txt1 乘法: 1 name: Built2 乘法: 4 name:Teardown3 乘法: 9 name:Teardown4 乘法: 16 name: Built5 乘法: 25 name:Teardown6 乘法: 36 name:Teardown7 乘法: 49 name: Built8 乘法: 64 name: Built9 乘法: 81 name: Built10 乘法:100 name:Teardown
獲得文件總行數
awk 'END{print NR}' firewallb-week2-origin.sql
[dss@localhost ~]$ awk 'END{print NR}' firewallb-week2-origin.sql 16600931
4.awk 參數
-v 指定程序中的變量 awk -v a=1 '{xxx}' 可以使用a變量
-f 指定程序外部文件 awk -f bb.awk data
-F 指定分隔符 awk -f \\t '{xxx}' 指定分隔符為\t ,默認為空格
5:數組的用法
有一個文件,第1欄是人員編號,其后幾行是會的語言
[jifeng@jifeng02 hadoop]$ cat course.txt 1 英語 中文 法文 日文 2 中文 法文 3 中文 法文 日文 4 中文 法文 拉丁 5 中文 法文 德文 要統(tǒng)計會各種語言的人數,執(zhí)行如下:建立如下程序,并取名為 course.awk:
[jifeng@jifeng02 hadoop]$ cat course.awk { for( i=2; i <= NF; i++) Number[$i]++ }END{for(course in Number) printf("%10s %d\n", course, Number[course] )}
執(zhí)行:
[jifeng@jifeng02 hadoop]$ awk -f course.awk course.txt法文 5中文 5德文 1日文 2拉丁 1英語 1
總結
- 上一篇: hive 简单操作搜狗实验室的词频文件
- 下一篇: 编译hadoop的eclipse插件ha