awk编程根本使用示例

awk编程基本使用示例
对于每一行,如果第三列大于0,则打印第一列,第二列*第三列的值
awk `$3>0 {print $1,$2*$3}` file1 file2
-f指定执行程序的文件
awk -f programfile inputfile  

打印整行输入
awk `{print}` 或者 awk `{print $0}`

NR当前行数,NF当前行的列数,下面这个 是打印当前行的列数,第一列和最后一列
awk `{print NR, NF, $1, $NF}`

格式化输出,跟c语言格式化类似
awk `printf("%-8s %.2f", $1,$2*$3)`

排序
awk `$3>0 {print $1,$2*$3}` file1 file2 | sort

计算后再选择
awk `$3 * $2>50 {print $1,$2*$3}` file1 file2
awk `$1=="suite" {print $1,$2*$3}` file1 file2
awk `!($NF>5 || $NF < 2)" {print $1,$2*$3}` file1 file2 

BEGIN 和 END BEGIN在处理输入前先执行BEGIN语句块
awk `BEGIN{print " name  rate number:"}{print}`
统计第三列大于50的总数,在处理完输入之后最后输入第三列大于50的总数
awk `$3>50{$emp=$emp+1} END{print $emp}`

字符串拼接
awk `{$name=$name $1 " "} END {print $name}`

内置函数length
awk `{print $1, length($1)}`

if-else
awk `$2>10{$n=$n+1,$pay=$2*3} END{if($n>0) print n else print "no"}`

while语句
awk `i=1 while(i<$3){printf("%s",$3) i=i+1}`

for
awk `{for(i=1;i<$3;i=i+1)printf("%s",$3)}`

arrays
逆序打印
awk `{line[NR]=$0} END {i=NR while(i>0){print line[i] i=i-1}}`

字段分隔符
awk `BEGIN{FS="\t"}{printf("$s %s",$1,$2) $cnt=$cnt+$2}END{print $cnt}`

正则匹配
$2包含字符串asia
awk `$2  ~ /asia/ print $3`
$2没有包含字符串asia
awk `$2  !~ /asia/ print $3`

内置变量
FNR 需要读入的行数 FILENAME 读入的文件名

赋值到字段中
awk `BEGIN{FS=OFS="\t"} $2=="aaa" {$4="bbb"} $2=="ccc" {$4="ddd"}{print}`

内置数学函数
atan2(y,x) cos(x) exp(x) int(x) log(x) rand(x) sin(x) sqrt(x) srand(x)

string内置函数
gsub(r,s) gsub(r,s,t) index(s,t) length(s) match(s,r) split(s,a) split(s,a,fs) sprinf() sub(r,s) substr(s,p)

do statement while(expr)
break continue
next exit

delete函数
for(i in pop)
  delete pop[i]

多维数组
pop[i,j]
if((i,j) in arr) ...