基本数据
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