BASH解析和生成MYSQL插入

BASH解析和生成MYSQL插入,bash,sed,awk,Bash,Sed,Awk,我有以下文本行: "Field1":"Data1","Field2":"Data2","Field3":"Data3","Field4":"Data4" ... 我需要生成以下INSERT语句: INSERT INTO data (Field1,Field2,Field3,Field4 ... ) VALUES(Data1,Data2,Data3,Data4 ... ); 关于如何在BASH中实现这一点,有什么想法吗 提前谢谢 您可以尝试此awk命令: $ cat file "Field1"

我有以下文本行:

"Field1":"Data1","Field2":"Data2","Field3":"Data3","Field4":"Data4" ...
我需要生成以下INSERT语句:

INSERT INTO data (Field1,Field2,Field3,Field4 ... ) VALUES(Data1,Data2,Data3,Data4 ... );
关于如何在BASH中实现这一点,有什么想法吗


提前谢谢

您可以尝试此awk命令:

$ cat file
"Field1":"Data1","Field2":"Data2","Field3":"Data3","Field4":"Data4"
$ awk -F'[:"]+' '{s=(NR>1?",":""); fields=fields s $2;data=data s $3}END{printf "INSTERT INTO data(%s) VALUES(%s)\n", fields,data}' RS="," file
INSTERT INTO data(Field1,Field2,Field3,Field4) VALUES(Data1,Data2,Data3,Data4)
或者更具可读性

#!/usr/bin/awk -f
BEGIN {
    FS ="[:\"]+";
    RS=",";
}
{
    s=(NR>1?",":"")
    fields=fields s $2
    data=data s $3
}
END{
    printf "INSTERT INTO data(%s) VALUES(%s)\n", fields,data
}
将其保存在名为
script.awk
的文件中,并按如下方式运行:

./script.awk file

您可以尝试此awk命令:

$ cat file
"Field1":"Data1","Field2":"Data2","Field3":"Data3","Field4":"Data4"
$ awk -F'[:"]+' '{s=(NR>1?",":""); fields=fields s $2;data=data s $3}END{printf "INSTERT INTO data(%s) VALUES(%s)\n", fields,data}' RS="," file
INSTERT INTO data(Field1,Field2,Field3,Field4) VALUES(Data1,Data2,Data3,Data4)
或者更具可读性

#!/usr/bin/awk -f
BEGIN {
    FS ="[:\"]+";
    RS=",";
}
{
    s=(NR>1?",":"")
    fields=fields s $2
    data=data s $3
}
END{
    printf "INSTERT INTO data(%s) VALUES(%s)\n", fields,data
}
将其保存在名为
script.awk
的文件中,并按如下方式运行:

./script.awk file

因为您特别要求使用BASH解决方案(而不是awk、perl或python):

data='“Field1”:“Data1”,“Field2”:“Data2”,“Field3”:“Data3”,“Field4”:“Data4”
data=${data/,/$'\n'}#用新行替换逗号
data=${data/\“/}删除引号
而IFS=':'读取-r字段项
做
如果[-n$fields]]
然后
fields=“$fields,$field”
items=“$items,$item”
其他的
字段=$field
items=$item
fi

完成<因为您特别要求提供BASH解决方案(而不是awk、perl或python):

data='“Field1”:“Data1”,“Field2”:“Data2”,“Field3”:“Data3”,“Field4”:“Data4”
data=${data/,/$'\n'}#用新行替换逗号
data=${data/\“/}删除引号
而IFS=':'读取-r字段项
做
如果[-n$fields]]
然后
fields=“$fields,$field”
items=“$items,$item”
其他的
字段=$field
items=$item
fi
完成<
$cat文件
“字段1”:“数据1”,“字段2”:“数据2”,“字段3”:“数据3”,“字段4”:“数据4”
$
$cat tst.awk
开始{FS=“^\”|\“[:,]\”|\“$”}
{
字段=值=“”
对于(i=2;i2?,“:”)$i
值=值(i>2?”,“:”)$(i+1)
}
printf“插入数据(%s)值(%s);\n”、字段、值
}
$
$awk-f tst.awk文件
在数据(字段1、字段2、字段3、字段4)中插入值(数据1、数据2、数据3、数据4);
$cat文件
“字段1”:“数据1”,“字段2”:“数据2”,“字段3”:“数据3”,“字段4”:“数据4”
$
$cat tst.awk
开始{FS=“^\”|\“[:,]\”|\“$”}
{
字段=值=“”
对于(i=2;i2?,“:”)$i
值=值(i>2?”,“:”)$(i+1)
}
printf“插入数据(%s)值(%s);\n”、字段、值
}
$
$awk-f tst.awk文件
在数据(字段1、字段2、字段3、字段4)中插入值(数据1、数据2、数据3、数据4);
假设数据值中没有
”,也没有
)值(
(如果需要也可以处理)


假设数据值中没有
”,也没有
)值(
(如果需要也可以处理)

太好了!非常感谢!非常感谢!正确的答案是根本不使用bash。请参阅中的第7项;正确的做法是使用一种语言与本机支持绑定参数的数据库绑定一起使用。任何其他方法都会导致bug(通过使代码的正确性取决于单个数据库的字符集转换、引用和类似逻辑)。如果您希望在使用构造的
INSERT
语句时从MySQL自动识别类型,则必须将输入转换为MySQL能够理解的类型形式(请参见@CharlesDuffy列表中的8)“generic”csv->Postgres script,我最后用标志将列类型表示为布尔值、日期、字符串和数字。例如,有时您可能希望将“0”视为布尔值(输出
false
),或者根据表列的类型将其保留为整数。脚本无法“神奇地”实现这一点“根据原始输入进行了解。正确的答案是根本不使用bash。请参阅中的第7项;正确的做法是使用一种语言,该语言的数据库绑定本机支持绑定参数。任何其他内容都可能导致bug(通过使代码的正确性取决于单个数据库的字符集转换、引用和类似逻辑)。如果您希望在使用构造的
INSERT
语句时从MySQL自动识别类型,则必须将输入转换为MySQL能够理解的类型形式(请参见@CharlesDuffy列表中的8)“generic”csv->Postgres script,我最后用标志将列类型表示为布尔值、日期、字符串和数字。例如,有时您可能希望将“0”视为布尔值(输出
false
),或者根据表列的类型将其保留为整数。脚本无法“神奇地”实现这一点"基于原始输入了解。如果输入包含反斜杠,则将失败,原因是缺少用于读取的
-r
arg,将根据安装的echo版本在不同的系统上产生不同的输出,并且由于未引用的shell变量,将产生其他意外结果。不要使用shell解析文本文件-这就是awk发明来做并且做得最好。@EdMorton…实际上,这里缺少引用的地方是作业的右侧或
[[]]
(具有特殊的解析阶段行为)内部。这些不是字符串拆分或全局扩展,因此无论如何都不需要引用。而且,
echo
的shell内置版本会隐藏系统二进制文件,因此echo在bash中的行为是一致的。你是对的,
read
应该有
-r
,但其他批评是错误的。@CharlesDuffy我从来没有听说过这一点
echo
以前在bash脚本中使用时保证一致。好的,感谢您提供的信息。bash的echo是否复制输出中的文本,例如,当它在输入中看到
\n
时是否打印
\n
,或者是否将其转换为换行符?@EdMorton,如果您想要保证一致性的话nt和safe,
printf%s“$var”
是最佳做法。但是,
echo“$foo”只要变量foo byte的内容不是精确的
-n
-e
-e
printf
和echo一样是内置的bash,它也是内置的ksh93,但不是ksh88 w