2017-07-04 7 views
-1

ファイル内にユーザー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

いいえ、jsonのようなjsonパーサを使用してください – 123

+1

私たちにjsonの入力を表示し、どのようにクエリを行うべきですか – Inian

+0

@Inian質問を更新しました。 – guided1

答えて

2

あなたJSON入力は、それは不可能あなたがbrew install jq

エラーでインストールすることができますOS X上のどのjqのようなパーサを使用してそれらを解析することができます問題のカップルを持っているあなたの質問からJSON無料になり

{ 
    "results": [ 
    { 
     "UID": "abc" 
    }, 
    { 
     "UID": "124" 
    } 
    ], 
    "objectsCount": 5, 
    "totalCount": 10966, 
    "statusCode": 200, 
    "errorCode": 0, 
    "statusReason": "OK" 
} 

これを解析して、UID値を含むクエリとして2つのステートメントを生成するには、

jq --raw-output '"INSERT IGNORE INTO potential_problem_users VALUES (" + (.results[] | .UID) + ")"' users.json 

jqで加算演算子+は、あなたが最終文字列を形成するために、文字列を連結することができます

INSERT IGNORE INTO potential_problem_users VALUES (abc) 
INSERT IGNORE INTO potential_problem_users VALUES (124) 

として出力を生成します。

jq snippet from jqplay

2
awk -F: '/UID/ {print "INSERT IGNORE INTO potential_problem_users VALUES ("gensub(" ","","g",$2)");"}' users.json 

gensubを使用して、区切られたフィールドからスペースを取ります。 awkにファイルをcatする必要はありません。

0

OS Xでは、Linuxでも動作するJSONパーサーがいくつか用意されています。 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) 
0

users.jsonは、(キャリッジリターンが含まれていますaka \r s aaa control-M s)、dos2unixなどを実行してからawkスクリプトを再実行してください(または他のスクリプトを実行してくださいあなたがまだ問題がある場合は、私たちに知らせてください。

ほとんどの場合、開始時に表示される行の最後に表示されると思われる文字が見つかるたびに、問題はcontrol-Mです。

関連する問題