awk-3 运算符与函数

前两篇回顾
awk - 简介 Linux 制表好工具
awk-2 Regex搭配浅谈

awk是个程序语言, 除了if else流程操作, 也有基本的运算符的支持.

# 计算a+b
awk 'BEGIN {a=1; b=3; print (a+b)}'
> 4

# 计算a%b 取馍
awk 'BEGIN {a=13; b=2; print (a%b)}'
> 1

# 透过--递减运算; 前置递减;
# 会把a减1, 更新回a, 再塞给b
awk 'BEGIN {a=13; b=--a; print (a, b)}'
> 12 12

# 透过--递减运算; 後置递减;
# 先把a塞值给b, 再把a减1, 更新回a
awk 'BEGIN {a=13; b=a--; print (a, b)}'
12 13

# 这里动作是```a b+c```, 对awk来说空格就表示做字串拼接, 所以显示会是1329
awk 'BEGIN {a=13; b=14; c=15;  print (a b+c)}'
> 1329

# 也是先字串拼接1314再做+15, 所以也输出1329
awk 'BEGIN {a=13; b=14; c=15;  print (a b)+c}'
> 1329

# 先b*c後做字串拼接
awk 'BEGIN {a=1; b=2; c=3;  print (a b*c)}'
> 16

# 先字串拼接後做b*c
awk 'BEGIN {a=1; b=2; c=3;  print (a b)*c}'
> 36

# 在做b+c时, 因为b目前是字串, awk会看字串开头是否有数字, 取出来做运算
# 这里开头都不是数字, 因此视为0
awk 'BEGIN {a=1; b="ithome"; c=3;  print b+c}';
awk 'BEGIN {a=1; b="ithome13"; c=3;  print b+c}';
> 3
> 3

# 在做b+c时, 因为b目前是字串, awk会看字串开头是否有数字, 取出来做运算
# 这里字串开头有16, 因此视为b+c被视为13+3
awk 'BEGIN {a=1; b="13ithome"; c=3;  print b+c}'
> 16

也有支持Array的操作, 宣告方式为arrayName[index]=value

# 存取方式arrayName[index]
awk 'BEGIN {ithome["13"]=2021;ithome["12"]=2020; print ithome["13"]}'
> 2021

# 删除array元素, ```delete array[index]```
awk 'BEGIN {ithome["13"]=2021;ithome["12"]=2020; delete ithome["12"]; print ithome["13"], ithome["12"]} '
> 2021 

# 搭配for loop, 探索并列印出array的元素
awk 'BEGIN {ithome["13"]=2021;ithome["12"]=2020; \
for (i in ithome)  \ 
print ithome[i];}'
> 2020
> 2021

# 搭配for loop, , 探索并列印出bash array的元素
# 先宣告bash array
# 透过printf+换行符号, 将之转换成每个元素一行
ithome=("10th" "11th" "12th" "13th"); 
printf '%s\n' "${ithome[@]}" | awk  '{arr[NR]=$1;} END { \                              
pipe quote> for (i in arr) \
pipe quote> print arr[i]}'
> 12th
> 11th
> 10th
> 13th

内置函数

# 随机返回0<=N<1的值
awk 'BEGIN {print rand()}'
> 0.696453

# 返回Epoch(1970-01-01 UTC)到目前为止的秒数
awk 'BEGIN {print systime()}'
> 1631465043

# system函数可以执行指定的系统命令
# 如果正常执行且完成, 则返回0 ; 否则返回非0
awk 'BEGIN {location=system("pwd"); print location}'
> /home/nathan
> 0

自定义函数

vim demo.awk

# find_min有两个参数num1, num2
# 回传最小的一个
function find_min(num1, num2)
{
    if (num1 < num2)
        return num1
    return num2
}

BEGIN {print find_min(10, 20)}
awk -f demo.awk
> 10

<<:  Day 8 - 依 DEALERS 前台页面分析拆解後,逐步建立後台功能 (上) - GridView 应用 - ASP.NET Web Forms C#

>>:  Day7 Map and Struct

Day 20 资料库评估 - Database Assessment (sqlmap, SQLite database browser)

前言 今天又进入到了新的一个分类,这个分类里面只有两个工具: SQLite database bro...

[Day6] 词性标注(一)-前言

一. 前言 词性标注 Part Of Speech(後面皆简称POS),简单来说就是将文章、句子中,...

qpushbutton 不同的字不同大小和顔色

由於不同的字用不同的样式,所以需要用到html来设定: //add take buttons wit...

[Day12] Vite 出小蜜蜂~ Spawn!

Day12 Level Design 接下来我们要开始设计关卡, 小蜜蜂的关卡很单纯,但是背後的心理...

[今晚我想来点 Express 佐 MVC 分层架构] DAY 29 - node.js 与线程 (下)

上一篇提到有工具可以做到丛集 (Cluster) 的功能,以使用多线程,今天就要来简单介绍一下这个强...