我有一个文件中的用户ID列表,我正在尝试从该文件生成一些sql。
cat users.json | awk '/UID/{print "INSERT IGNORE INTO potential_problem_users VALUES ("$2");" }'
但它并没有按照我的预期行事:
);SERT IGNORE INTO potential_problem_users VALUES ("1"
);SERT IGNORE INTO potential_problem_users VALUES ("2"
我正在尝试的查询是:
INSERT IGNORE INTO potential_problem_users VALUES ([userID]);
示例json如果有帮助:
{
"results": [
{
"UID": "abc"
},
{
"UID": "124"
}
],
"objectsCount": 5,
"totalCount": 10966,
"statusCode": 200,
"errorCode": 0,
"statusReason": "OK"
}
我使用的是正确的工具吗?如果我是,我做错了什么?
答案 0 :(得分:2)
您的JSON
输入存在一些问题,导致无法使用OS X
等解析器解析它们brew install jq
您可以JSON
安装
您问题中的错误{
"results": [
{
"UID": "abc"
},
{
"UID": "124"
}
],
"objectsCount": 5,
"totalCount": 10966,
"statusCode": 200,
"errorCode": 0,
"statusReason": "OK"
}
将是
JSON
要解析此jq --raw-output '"INSERT IGNORE INTO potential_problem_users VALUES (" + (.results[] | .UID) + ")"' users.json
并生成两个语句作为包含UID值的查询,只需执行
INSERT IGNORE INTO potential_problem_users VALUES (abc)
INSERT IGNORE INTO potential_problem_users VALUES (124)
会产生输出
+
jq
中的加法运算符SELECT *
FROM flexible_products
WHERE
YEAR(updated_at) = YEAR(CURRENT_DATE) AND
MONTH(updated_at) < MONTH(CURRENT_DATE())
允许您连接字符串以形成最终字符串。
答案 1 :(得分:2)
awk -F: '/UID/ {print "INSERT IGNORE INTO potential_problem_users VALUES ("gensub(" ","","g",$2)");"}' users.json
使用gensub从第二个:分隔字段中取出空格。另请注意,您不需要捕获文件以使其失败。
答案 2 :(得分:0)
在OS X上,您可以使用多个JSON解析器,这些解析器也适用于Linux。您可以使用Perl,Python或Ruby等。
以下是Ruby的演示:
假设:
$ cat json
{
"results": [
{
"UID": "abc"
},
{
"UID": "124"
}
],
"objectsCount": 5,
"totalCount": 10966,
"statusCode": 200,
"errorCode": 0,
"statusReason": "OK"
}
您可以解析该文件并以这种方式打印到感兴趣的行:
$ ruby -0777 -lane 'require "json"
d=JSON.parse($_)
d["results"].each {|e| puts "INSERT IGNORE INTO potential_problem_users VALUES (#{e["UID"]})" }' json
INSERT IGNORE INTO potential_problem_users VALUES (abc)
INSERT IGNORE INTO potential_problem_users VALUES (124)
答案 3 :(得分:0)
users.json
包含回车(又名\r
s又名control-M
s),首先运行dos2unix
或类似内容然后重新运行您的awk脚本(或运行任何其他脚本)然后让我们知道你是否还有问题。
几乎每次你找到你希望在开头出现的一行结尾时看到的字符而不是问题是控制 - 女士。