Linux学习笔记(八):awk实战小案例
怎么把数字金额用汉字表示?
思维过程
1.创建一个awk脚本文件
2.数据初始化
awk分为三部分:
BEGIN{} #主要初始化一些数据,定义一些静态值
...#中间代码
END{}
- **我们需要初始化一个
全局
数组来记录汉字,方便取值,如["壹","贰",...]
3.校验
输入的校验,也许你应该校验输入值是不是一个合法金额
4.规整化
输入值,将所有输入值变成
xxx.xx
这样的格式方便操作
5.提取
提取出整数部分,和小数部分,并做出判断,如
全0
:…
整数0
: …
小数0
: …
其他
: …
分别处理
针对整数部分和小数部分分别
编写函数
进行汉字转变
- 小数
提取出值在前面的初始化的数组中取值,如
nums[i]
根据不同情况进行输出,主要处理0的情况
- 整数
写一个方法,进行判断递归进行判断
如:if (num >= 10000) {#取出剩下的nextNum = num % 10000;if (nextNum < 1000) return 递归(num / 10000) "万零" 递归(nextNum)return 递归(num / 10000) "万" 递归(nextNum) }
类似的进行处理
调用
编写完成之后,进行调用看结果是否正确
代码
1.创建
touch num2zh
2.编写代码
#!/usr/bin/awk -f
BEGIN{init()
}{printf "%10s\t",$1}!/^[+]?(([1-9][0-9]*)|0)(\.[0-9]{1,2})?$/{print "Error: Not a correct money"next
}/+/{gsub(/+/,"")
}{amount = sprintf("%.2f",$1)print num2str(amount)
}function num2str(n)
{cents = substr(n,length(n) - 1,2)dols = substr(n,1,length(n) - 3)if (dols+0 == 0 && cents+0 == 0)return "零圆整"if (dols+0 == 0)return double2str(cents) if (cents+0 == 0)return int2str(dols) "圆整"return int2str(dols) "圆" double2str(cents)
}function int2str(n)
{if (n+0 >= 100000000) {nextNum = n % 100000000if (nextNum != 0 && nextNum < 10000000) return int2str(int(n/100000000)) "亿零" int2str(nextNum)return int2str(int(n/100000000)) "亿" int2str(nextNum)}if (n+0 >= 10000) {nextNum = n % 10000if (nextNum != 0 && nextNum < 1000)return int2str(int(n/10000)) "万零" int2str(nextNum)return int2str(int(n/10000)) "万" int2str(nextNum)}if (n+0 >= 1000) {nextNum = n % 1000if (nextNum != 0 && nextNum < 100)return int2str(int(n/1000)) "仟零" int2str(nextNum)return int2str(int(n/1000)) "仟" int2str(nextNum)}if (n+0 >= 100) {nextNum = n % 100if (nextNum != 0 && nextNum < 10) return int2str(int(n/100)) "佰零" int2str(nextNum)return int2str(int(n/100)) "佰" int2str(nextNum)}if (n+0 >= 10) {return int2str(int(n/10)) "拾" int2str(n%10)}if (n+0 == 0) return ""return nums[n]
}function double2str(c)
{a = int(c/10)b = c % 10 if (a+0 == 0)return nums[b] "分"if (b+0 == 0)return nums[a] "角"return nums[a] "角" nums[b] "分"
}function init()
{split("壹,贰,叁,肆,伍,陆,柒,捌,玖",nums,",")
}
3.使用
# 1.创建输入文件,如下
vi amount.txt
-300
123456.789
1234567.89
+987654.30
123456.00
3.4.5
0
100301
100300
100300.05
3000
300001
101010101.01# 赋予可执行权限
chmod +x num2zh#运行
./num2zh amount.txt#结果-300 Error: Not a correct money
123456.789 Error: Not a correct money
1234567.89 壹佰贰拾叁万贰拾叁圆捌角玖分
+987654.30 玖拾捌万柒仟陆佰伍拾肆圆叁角123456.00 壹拾贰万叁仟肆佰伍拾陆圆整3.4.5 Error: Not a correct money0 零圆整100301 壹拾万零叁佰零壹圆整100300 壹拾万零叁佰圆整100300.05 壹拾万零叁佰圆伍分3000 叁仟圆整300001 叁拾万零壹圆整
101010101.01 壹亿零壹佰零壹万零壹圆壹分