工作日常,需要查数据库,或者load日志。筛出符合一定业务逻辑的数据。
然后整理成一定格式的文件,有时基础数据不全,还要在晒出的数据文件基础上,做些逻辑判断,添加一些数据。
比如,线上业务充值赠送礼品。不同的充值额度,赠送的礼品数不同。
原始文件
"11111","5"
"22222","10"
"33333","15"
"44444","20"
"55555","25"
"66666","30"
其中第一列是用户id,第二列是充值金额
目标文件是
11111,5,100
22222,10,100
33333,15,200
44444,20,200
55555,25,300
66666,30,300
想判断第二列的值,1-10赠100,11-20赠200,21-30赠300。第三列是赠送的礼品数。
分两步,先预处理下文件。第二列是字符串,没法比较大小,先去掉“”。这个场景比较适合用sed指令工具处理。
cat file.txt |sed 's/"//g'
's/要替换的字符/替换后的字符/g'
s替换,g全部替换。
然后用awk处理,使用if表达式
cat temp |awk -F ',' '{if ($2>=1&& $2<10) print $1","$2","100; else if ($2>=10&& $2<20) print $1"," $2","200; else if ($2>=20&& $2<=30) print $1","$2","300}'
或者
cat temp |awk -F ',' '{if ($2>=1&& $2<10) {print $1","$2","100} else if ($2>=10&& $2<20) {print $1"," $2","200} else if ($2>=20&& $2<=30) {print $1","$2","300}}'
语法:
awk -F ',' '{if(条件){执行表达式}
else if(条件){执行表达式}
else{执行表达式}}'
或者执行表达式不加大括号,条件之间用;分割。
有一点调试一会,就是shell脚本里条件里边不支持
10>a>5表达,要分开。。
a>5&&a<10
发现java语法也不支持,我这是在哪看到了这样的写法。。
sed是流编辑器,是逐行取出文本内容然后再进行处理。既然是编辑器那sed在编辑文件方面就具有很多优势,比如插入新行,修改某行,根据正则匹配某行同时修改。跟我们平时使用的交互式文本编辑器差不多,但是sed可以提前做好剧本,然后无需中断无需交互就能达到最终想要的结果。
而awk是报表生成工具,也是逐行取出文件,但是取出来的目的是把内容进行二次加工,然后把有用的数据单独用优雅的格式输出,或者进行归纳统计得到统计结果,等等。
网友评论