通过脚本(awk,grep)清洗实体类数据,存入数据库
Posted DATA数据猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过脚本(awk,grep)清洗实体类数据,存入数据库相关的知识,希望对你有一定的参考价值。
通过脚本(awk,grep)清洗实体类数据,存入数据库
👊一、前言
部分数据库在建表的时候,不能像mysql一样直接在字段后加comment对字段做注释。通过comment on column dbname.tablename.fieldname is '';
的方式一个一个加字段注释较为麻烦,而一般在项目代码中都会对字段做备注,所以打算使用Linux的grep和awk写脚本进行处理,然后存入到数据库的一张表中,以便查看。
Linux三剑客,grep擅长查找功能,sed擅长取行和替换,awk擅长取列
如下,就简单模拟一些实体类文件进行介绍,在实际场景中也是同样的操作。
👊二、逐步处理过程
🙇♀2.1 cat实体类
cat
命令可直接在终端查看文件数据
[root@zxy_master dao]# cat ./User.java
package com.zxy.pojo;
import java.util.Date;
public class User
private Integer id;//ID
private String email;//邮箱
private String phonenum;//电话
private String password;//密码
private String code;//编码
private String nickname;//昵称
...................
🙇♀2.2 grep只查看字段行
将cat
到的结果以管道的形式,传给grep
做处理。使用grep
只查询包含private
的行
[root@zxy_master dao]# cat ./User.java | grep private
private Integer id;//ID
private String email;//邮箱
private String phonenum;//电话
private String password;//密码
private String code;//编码
private String nickname;//昵称
private String sex;//性别
private String birthday;//出生日期
private String address;//地址
private String imgurl;//头像URL
private Date createtime;//创建时间
🙇♀2.3 awk空格切分取第三列
将grep
查询到的数据,以管道的形式的传给awk做处理。awk
命令加-F
,可以指定按照什么切分数据。使用print
输出数据,$3
可以用来取切分后的第三列数据。
[root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' 'print $3'
id;//ID
email;//邮箱
phonenum;//电话
password;//密码
code;//编码
nickname;//昵称
sex;//性别
birthday;//出生日期
address;//地址
imgurl;//头像URL
createtime;//创建时间
🙇♀2.4 awk指定符号切分,并依据空格输出
经过上一步的处理,得到了字段和注释,现在字段和注释之间只有符号;//
,所以再次使用awk
,按照这些字符切分后,分别取到第一和第二个数据输出即可。为方便后续导入到数据库中,在字段和注释之间,以空格划分。
[root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' 'print $3' | awk -F ';//' 'print $1"\\t"$2'
id ID
email 邮箱
phonenum 电话
password 密码
code 编码
nickname 昵称
sex 性别
birthday 出生日期
address 地址
imgurl 头像URL
createtime 创建时间
🙇♀2.5.1 输出处理结果
将上一步处理的结果,以文件的形式处理,这里采用>>
文件数据追加的方式。
[root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' 'print $3' | awk -F ';//' 'print $1"\\t"$2' >> JavaETLFile.txt
[root@zxy_master dao]# cat JavaETLFile.txt
id ID
email 邮箱
phonenum 电话
password 密码
code 编码
nickname 昵称
sex 性别
birthday 出生日期
address 地址
imgurl 头像URL
createtime 创建时间
🙇♀2.5.2 优化输出处理结果
从上一步可以看出,输出的结果中只有数据,如果后续将数据导入表中的话,是需要对数据做一下标注的。
这里为了效果明细,先把上一步生成的文件删除,在awk后添加,BEGIN print "field""\\t""remark"
,即可实现在第一行输出指定数据。
[root@zxy_master dao]# rm -r JavaETLFile.txt
rm: remove regular file ‘JavaETLFile.txt’? y
[root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' 'print $3' | awk -F ';//' 'BEGIN print "field""\\t""remark" print $1"\\t"$2' >> JavaETLFile.txt
[root@zxy_master dao]# cat JavaETLFile.txt
field remark
id ID
email 邮箱
phonenum 电话
password 密码
code 编码
nickname 昵称
sex 性别
birthday 出生日期
address 地址
imgurl 头像URL
createtime 创建时间
👊三、完善处理过程一
🙇♀3.1 脚本介绍
以上内容,简单介绍了整体的处理流程,但是使用命令行的形式,一个一个的处理实体类还是比较麻烦的,这一步就通过将命令写到脚本中,通过传入实体类名的形式依次处理。
通过
1
接收脚本传入的参数
,
将传入的参数赋给
F
i
l
e
N
a
m
e
,后续能直接使用这个参数接收值。主要在两个部分用到,第一个是
‘
1接收脚本传入的参数,将传入的参数赋给FileName,后续能直接使用这个参数接收值。主要在两个部分用到,第一个是`
1接收脚本传入的参数,将传入的参数赋给FileName,后续能直接使用这个参数接收值。主要在两个部分用到,第一个是‘FileName.java,从而获取原始数据。第二个是
-v filename=“$FileName”,使用
-v可以动态获取参数,从而将
filename的数据使用
print filename"\\t"$1"\\t"$2命令。
[root@zxy_master dao]# vim JavaToTxt.sh
#!/bin/bash
# filename: JavaToTxt.sh
# auth: zxy
# date: 2022-09-04
# 接收参数
FileName=$1
cat ./$FileName.java | grep private | awk -F ' ' 'print $3' | awk -F ';//' -v filename="$FileName" 'BEGIN print "tablename""\\t""field""\\t""remark" print filename"\\t"$1"\\t"$2' >> JavaETLFile.txt
🙇♀3.2 脚本测试
[root@zxy_master dao]# sh JavaToTxt.sh User
[root@zxy_master dao]# cat JavaETLFile.txt
tablename field remark
User id ID
User email 邮箱
User phonenum 电话
User password 密码
User code 编码
User nickname 昵称
User sex 性别
User birthday 出生日期
User address 地址
User imgurl 头像URL
User createtime 创建时间
👊三、完善处理过程二
通过如上脚本,即可以在执行脚本的时候传入实体类名称进行处理数据,下面就再次通过脚本,一次性获取所有实体类的执行命令。对这个指令就不做详细的介绍,不太明白的可以参考第二节的介绍
[root@zxy_master dao]# ls
Admin.java Course.java JavaToTxt.sh QueryVo.java Speaker.java User.java
[root@zxy_master dao]# ll | grep '.java' | awk -F ' ' 'print $9' | awk -F '.' 'print "sh JavaToTxt.sh "$1'
sh JavaToTxt.sh Admin
sh JavaToTxt.sh Course
sh JavaToTxt.sh QueryVo
sh JavaToTxt.sh Speaker
sh JavaToTxt.sh User
[root@zxy_master dao]# sh JavaToTxt.sh Admin
[root@zxy_master dao]# sh JavaToTxt.sh Course
[root@zxy_master dao]# sh JavaToTxt.sh QueryVo
[root@zxy_master dao]# sh JavaToTxt.sh Speaker
[root@zxy_master dao]# sh JavaToTxt.sh User
[root@zxy_master dao]#
[root@zxy_master dao]# cat JavaETLFile.txt
tablename field remark
Admin id ID
Admin username 用户名
Admin password 密码
Admin roles 角色
tablename field remark
Course id ID
Course courseTitle 课程标题
Course subjectId 主题ID
Course courseDesc 课程详情
Course videoList;
tablename field remark
QueryVo title 标题
QueryVo courseId 课程ID
QueryVo speakerId 讲师ID
tablename field remark
Speaker id ID
Speaker speakerName 讲师名
Speaker speakerJob 讲师工作
Speaker headImgUrl 头像URL
Speaker speakerDesc 讲师介绍
tablename field remark
👊四、完整处理脚本
#!/bin/bash
# filename: JavaToTxt.sh
# auth: zxy
# date: 2022-09-04
# 接收参数
FileName=$1
# 帮助函数
usage()
echo "usage:"
echo "sh JavaToTxt.sh filename"
echo "获取批量处理文件命令如下:"
echo "ll | grep '.java' | awk -F ' ' 'print $9' | awk -F '.' 'print "sh JavaToTxt.sh "$1'"
exit 0
cat ./$FileName.java | grep private | awk -F ' ' 'print $3' | awk -F ';//' -v filename="$FileName" 'BEGIN print "tablename""\\t""field""\\t""remark" print filename"\\t"$1"\\t"$2' >> JavaETLFile.txt
👊五、数据导入
将txt文件下载下来,导入到数据库中即可,方法很多,仅供参考。
👊六、数据简单处理
因为在执行脚本时,每执行一次都会输出一次使用awk
的Begin
的内容,也就是tablename,field,remark
,在导入数据后做简单处理。另一种是,当字段没有注释的时候,会存在切分后取到一行空值的,处理即可。
以上是关于通过脚本(awk,grep)清洗实体类数据,存入数据库的主要内容,如果未能解决你的问题,请参考以下文章
shell脚本学习总结----sed+grep+awk+正则
linux生产文本处理掌握这些就够了:awk,gawk,sed,grep,sort