使用字符串中的文件匹配

时间:2017-07-04 16:27:43

标签: linux bash macos awk

我有一个文件中的用户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"
}

我使用的是正确的工具吗?如果我是,我做错了什么?

4 个答案:

答案 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()) 允许您连接字符串以形成最终字符串。

jq

答案 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脚本(或运行任何其他脚本)然后让我们知道你是否还有问题。

几乎每次你找到你希望在开头出现的一行结尾时看到的字符而不是问题是控制 - 女士。