我有一个文件需要转换成mysql插入语句,格式如下:
1
'Jan'
'Jame'
'O\'Leary'
'Bill'
''
NULL
1
'Eddie'
'Eddie'
'Unknown'
NULL
NULL
'John'
NULL
'Joseph'
我正在尝试使用以下代码来准备语句:
COUNTER=1;
echo "insert into database.table values " > full_statements.sql
while read LINE
do
# There are 16 fields of information per insert statement.
MODULUS=$(( $COUNTER % 16 ))
# First piece of information needs to be in format "(value"
if [ "$COUNTER" -eq 1 ]; then
printf "("$LINE >> full_statements.sql
# Last piece of information needs to be in format ",value),"
elif [ "$MODULUS" -eq 0 ]; then
printf ","$LINE")," >> full_statements.sql
# Interior pieces of information need to be in format ",value"
else
printf ","$LINE >> full_statements.sql
fi
# If we have a complete insert statement, reset the COUNTER.
if [ "$COUNTER" -eq 16 ]; then
COUNTER=1
else
((COUNTER++))
fi
done < binfile.new
不幸的是,我的结果如下:
insert into database.table values
(1,'Jan','Jame','O'Leary','Bill','',NULL,1,'Eddie','Eddie','Unknown',NULL,NULL,'John',NULL,'Joseph');
预期输出:
insert into database.table values
(1,'Jan','Jame','O\'Leary','Bill','',NULL,1,'Eddie','Eddie','Unknown',NULL,NULL,'John',NULL,'Joseph');
我用来转义 O'Leary 名字中的引号的反斜杠不会打印出来。我竭尽全力试图将这个“\”包含在输出中,但一直找不到答案。
帮助! :-)
最佳答案
在 awk 中。使用模 16 识别记录更改(即支持文件中超过 16 行)和三元运算符在内容之前和之后插入内容:
$ cat program.awk
{
printf "%s%s%s",(NR%16==1?"INSERT INTO DATABASE VALUES (":""),$0,(NR%16?",":");"ORS)
}
运行它:
$ awk -f program.awk file
INSERT INTO DATABASE VALUES (1,'Jan','Jame','O\'Leary','Bill','',NULL,1,'Eddie','Eddie','Unknown',NULL,NULL,'John',NULL,'Joseph');
关于linux - 准备mysql语句时需要打印反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39910202/