基本數據
godme male 99
judas female 100
foreva male 32
devil female 73
運行方式
文件輸入
awk '{print}' table
管道連接
cat table | awk '{print}'
程序文件
#!/bin/awk
# run.awk
{print}
awk -f run.awk table # -f 指定awk程序文件
參數
awk
從輸入中解析參數,都是依據列來進行解析,並從1
依次進行標記。
awk '{print $1, $3}' table
godme@~/project/awk$awk '$2 =="male" {print $1, $3}' table
godme 99
foreva 32
NF
awk
會自動記錄參數個數,使用NF
可直接獲取值
awk '{print NF, $NF}' table
godme@~/project/awk$awk '{print NF,$NF}' table
3 99
3 100
3 32
3 73
使用
$NF
,相當於獲取最後一個值,也就是.
$0
從1開始,指定的都是每行的參數,$0
指代的就是當前行,
awk '/godme/ { print $0}' table
# godme male 99
NR
這個參數表示了所在的行號
awk '{print NR, $0}' table
# 1 godme male 99
# 2 judas female 100
# 3 foreva male 32
# 4 devil female 73
命令格式
awk
的格式分爲兩部分
- 條件
- 命令
awk ' $2 == "male" {print}' table # awk ' condition {operation}' input_file
godme@~/project/awk$awk '$2 =="male" {print}' table
godme male 99
foreva male 32
條件
- 比較
awk '$3 == 99 {print}' table
# godme male 99
awk '$1 == "godme" {print}' table # 字符串記得引號
# godme male 99
awk '$3 > 80 {print}' table
# godme male 99
# judas female 100
awk '$3 < 80 {print}' table
# foreva male 32
# devil female 73
awk '$3 != 99 {print}' table
# judas female 100
# foreva male 32
# devil female 73
- 結合
awk '$3 < 70 || $3 > 99 {print}' table
# judas female 100
# foreva male 32
awk '$3 > 70 && $3 < 100 {print}' table
# godme male 99
# devil female 73
awk '!($3 > 70 && $3 < 100) {print}' table
# judas female 100
# foreva male 32
- 正則
awk '/godme/ {print}' table
# godme male 99
操作
這裏只簡單介紹
printf
操作,更多操作後續說明。
format | description |
---|---|
%s |
以字符串形式輸出 |
%f |
以浮點數輸出 |
浮點數格式說明
format description %6f
長度6 %6.2f
長度6,2位有效數字 %-9f
長度9,左對齊 awk '{printf("%-9s %5f %8.2f\n", $1, $3, $3)}' table # godme 99.000000 99.00 # judas 100.000000 100.00 # foreva 32.000000 32.00 # devil 73.000000 73.00
還可以結合sort
進行排序操作
awk '{print $NF, $0}' table | sort
# 100 judas female 100
# 32 foreva male 32
# 73 devil female 73
# 99 godme male 99 序號是錯誤的,但是第一個數字是正確的,應該以數值來進行排序
awk '{print $NF, $0}' table | sort -n
# 32 foreva male 32
# 73 devil female 73
# 99 godme male 99
# 100 judas female 100
分段
awk '{age = age + $NF} END {print "sum age : ", age}' table
# sum age : 304
以END
分隔的兩部分操作,前一段每次都會執行,遍歷完畢以後執行END
的語句。
利用
awk
的天然數值計算,還可以求平均awk '{age = age + $NF} END {print "average age : ", age / NR}' table # average age : 76