这个问题是在工作中遇到的,当时同事想将一个excel的文本转成sql再导入到数据库中。
文本test.txt内容如下:
- Jones 2143 78 84
- Gondrol 2321 56 58
- RinRao 2122 38 37
- Edwin 2537 87 97
- Dayan 2415 30 47
现在要转成类似于:
- insert into table values ('Jones', 2143, 78, 84);
这样的语句。
用awk来处理应该是非常简单的事,一行就够了。于是,写了下面的语句:
- awk '{print "insert into table values(\'"$1"\',"$2","$3","$4")"}' test.txt
很不幸的是,在awk中用"\"来转义单引号是不成功的。会报下面的错:
- -bash: syntax error near unexpected token `)'
要想正确输出单引号,至少有下面三种方法:
1.使用16进制\x27
- awk '{print "insert into table values(\x27"$1"\x27,"$2","$3","$4")"}' test.txt
2.使用8进制\047
- awk '{print "insert into table values(\047"$1"\047,"$2","$3","$4")"}' test.txt
3.使用变量替换
- awk -v d="'" '{print "insert into table values("d$1d","$2","$3","$4")"}' test.txt
这种方式稍微解释一下:-v是awk中定义变量的选项,d是定义的变量,其值是用双引号包起来的一个单引号。在$1两侧的是d变量,这样就避免了在单引号中输出单引号的麻烦。
三种方式的输出结果都是:
- insert into table values('Jones',2143,78,84)
- insert into table values('Gondrol',2321,56,58)
- insert into table values('RinRao',2122,38,37)
- insert into table values('Edwin',2537,87,97)
- insert into table values('Dayan',2415,30,47)