利用awk命令批量插入数据库

来源:互联网 发布:java找不到或无法加载 编辑:程序博客网 时间:2024/06/02 11:47

awk命令是一个非常强大的命令,在此我记录一下工作中遇到的一个问题。有一个文件,我这里的文件叫做test_case_name_trimmed.txt,里面存放着test_case_name,每一行是一个case的名字,一共有100行左右,如何将这些数据一次性的插入一个数据库的表中呢。数据库的表的结构如下:

mysql> desc page;+----------------+-------------+------+-----+---------+----------------+| Field          | Type        | Null | Key | Default | Extra          |+----------------+-------------+------+-----+---------+----------------+| id             | int(100)    | NO   | PRI | NULL    | auto_increment || test_case_name | varchar(32) | YES  | UNI | NULL    |                |+----------------+-------------+------+-----+---------+----------------+


该表有两个字段,其中的字段id是这个表的主键,它的类型是int,并且是递增的,另一个字段是test_case_name,类型是字符串。
最直观的想法是如何将这些数据组成正确合法的sql命令,将这些命令放到一个sql文件中,我这里放到了一个insert.sql的文件中,然后调用source insert.sql将数据批量地插入到数据库的表中。

我最开始的想法是通过sed来实现这个功能,以下是我实现的步骤:

sed 's/^/insert page(id,test_case_name) values("/g' test_case_name_trimmed.txt | sed 's/$/")/g'
这个结果和最终的合法的sql命令已经很接近了,但是有一个问题是它无法插入id,也就是每一行的1,2,3...。因为sed中好像没有哪个变量可以用来表示当前行所在的行数。这让我开始想到了awk,awk中不是恰好有一个变量NR来表示当前所处理行的行数吗?NR就是number of record的记录。于是开始利用awk来实现我的想法。最终的命令行如下:

awk '{print "insert into page(id, test_case_name) values("NR",", "'\''"$1"'\''"")"}' test_case_name_trimmed.txt
这中间比较有点麻烦的是利用awk来输出单引号或是双引号。自己试了一些方法没有解决,后来终于在网上找到了答案。输出双引号的方法:“\“”,先是两个双引号括住一个双引号,然后再在中间括住的双引号前加反斜杠符号\。输出单引号的方法较输出双引号稍微有些复杂,输出单引号的方法如下:”‘\’'“,最外层是两个双引号,然后中间是三个单引号,其中第一二个单引号中间有一个反斜杠符号\,这个反斜杠符号是对第三个单引号进行转义的,不至于让awk以为这个单引号是命令的结尾。第一二个单引号的作用就是括住反斜杠符号,第三个单引号才是最终要输出的单引号。



0 0
原创粉丝点击