awk-基本使用

基本数据

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,相当于获取最后一个值,也就是index=1index = -1.

$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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章