【问题标题】:Parse JSON file and output string after a string of alphabets and characters在一串字母和字符之后解析 JSON 文件并输出字符串
【发布时间】:2017-10-25 18:19:01
【问题描述】:

文件如下:

{"project":"platform/xxxxx/xxxxxx/build/repo","branch":"xxxxx_xx.xxxxx.xxx.1.0-dev","id":"T19797TIE76757IT78689899G","number":"1917095","subject":"xxxxx-2.0: blah blah blah","owner":{"name":"David","email":"david@xxxx.com","username":"david"},"url":"https://link_to_repo.com/1917095","createdOn":1493282302,"lastUpdated":1493813064,"sortKey":"000899786887","open":false,"status":"MERGED"

我需要在字符串 "number":" 或字符串 "https://link_to_repo.com/" 之后的数字 "1917095" ,因此即使字段的位置发生变化,输出也应该只给出这些数字。

我试图通过以下方式实现它:

awk -F'[,:"]' '{ print $23 }' file_name

这给了我结果,但我需要找到更好的解决方案。

所以我需要借助 python(我是新手)或 bash 中的任何工具来帮助实现这一目标?

【问题讨论】:

  • 数据真的都在一行吗?问题格式使它看起来在"David 之后有一个换行符。为什么需要“更好”的解决方案?
  • 是json文件吗?
  • @lit- 没有数据是这样的- {"project":"platform/xxxxx/xxxxxx/build/repo","branch":"xxxxx_xx.xxxxx.xxx.1.0-dev", "id":"T19797TIE76757IT78689899G","number":"1917095","subject":"xxxxx-2.0: blah blah blah","owner":{"name":"David","email":"david@ xxxx.com","username":"david"},"url":"link_to_repo.com/…" {"type":"stats","rowCount":1,"runTimeMilliseconds":3} ,换行在 "MERGED" 之后开始" 然后是 {"type":"stats","rowCount":1,"runTimeMilliseconds":3}。
  • @lit 我需要一个更好的解决方案,因为我的命令 awk 用分隔符分隔字段,然后显示字段,但我需要自动化这项工作,所以如果字段位置发生变化,那么所需的输出可能不在字段 $23 中,所以如果我可以从“link_to_repo.com/1917095”中提取数字,使用搜索并给出输出的命令在“link_to_repo.com”之后会更好。这就是我的观点。
  • @RomanPerekhrest 是的,但我只展示了一个 sn-p。

标签: python json regex shell awk


【解决方案1】:

正则表达式可用于仅选择数字。

$ awk '{ if (match($0,/number":"([0-9]*)"/,m)) print m[1] }' af.txt
1917095

如果需要从 URL 获取。

$ awk '{ if (match($0,/link_to_repo.com\/([0-9]*)"/,m)) print m[1] }' af.txt
1917095

$ awk '{ if (match($0,/link_to_repo.com\/([[:digit:]]*)"/,m)) print m[1] }' af.txt
1917095

我非常努力地尝试使用\d 来查找数字。这是一个 Perl 扩展,在 awk 正则表达式中不可用。

如果这些都不起作用,您的 awk 版本是什么? awk --version

【讨论】:

  • 它抛出以下错误-“awk: line 1: syntax error at or near ,”
  • 我已经编辑了答案以表明这些在我的系统上工作。
  • 感谢您的回答,我意识到我正在使用 mawk,而您必须使用 gawk。所以我安装了 gawk 然后以上所有的工作!
【解决方案2】:

我对你的数据稍作改动,因为你最后错过了 },并且这段代码在 python 3.6 下测试

data = {"project":"platform/xxxxx/xxxxxx/build/repo","branch":"xxxxx_xx.xxxxx.xxx.1.0-dev","id":"T19797TIE76757IT78689899G",
    "number":"1917095","subject":"xxxxx-2.0: blah blah blah","owner":{"name":"David","email":"david@xxxx.com","username":"david"},
    "url":"https://link_to_repo.com/1917095","createdOn":"1493282302","lastUpdated":"1493813064","sortKey":"000899786887","open":"false","status":"MERGED"}

 jsonobject = json.dumps(data)
 #print (jsonobject)
 jsonobjectToString = json.loads(jsonobject)
 #print (jsonobjectToString)

  print (jsonobjectToString["number"])


  =====
  1917095

【讨论】:

    【解决方案3】:

    你需要这样的东西吗:

    对于文件中只有一个json:

    例如,创建一个类似“string.py”的文件,并在其中放入以下代码:

    #!/usr/bin/python                                                               
    
    import sys, json                                                                
    
    with open(sys.argv[1]) as data_file:                                            
        data = json.load(data_file)                                                 
    print(data[sys.argv[2]])
    

    然后这样称呼它:

    python [file_name] [json_file] [json_attribute]
    

    例子:

    python string.py test.json number
    

    使用字符串搜索:

    #!/usr/bin/python                                                               
    
    import sys                                                                      
    
    with open(sys.argv[1]) as data_file:                                            
        data = data_file.readlines()                                                
    
    a = '"number":"'                                                                
    b = '","subject"'                                                               
    d = ''.join(data)                                                               
    result = d.split(a)[-1].split(b)[0]                                             
    print(result)
    

    然后这样称呼它:

    python [json_file]
    

    例子:

    python string.py
    

    【讨论】:

    • 谢谢,但它没有帮助,因为我收到以下错误 - data = json.load(data_file) File "/usr/lib/python2 中的文件 "string.py",第 6 行.7/json/__init__.py",第 290 行,加载中 **kw) 文件 "/usr/lib/python2.7/json/__init__.py",第 338 行,加载中返回 _default_decoder.decode(s) 文件“/usr/lib/python2.7/json/decoder.py”,第 369 行,在解码中引发 ValueError(errmsg("Extra data", s, end, len(s))) ValueError: Extra data: line 2 column 1 - 第 9 行第 1 列(字符 486 - 2168)
    • 它确实有效,但没有获取所有数字,从我的文件中它也显示一行中的一个数字,其余的都被忽略了。
    • 但是我尝试并获得了预期的结果,但我不确定我的方法有多好,因为我是 python-import json with open('file_name.json') as data_file: for line在 data_file: data = json.loads(line) if "number" in data: print data["number"]
    • 如果你加载的文件只有json更好更好!我用字符串回答了我的问题,因为我教你的文件包含的不仅仅是 json。请在您的问题中说明您使用的答案。
    猜你喜欢
    • 2012-10-04
    • 2012-01-22
    • 2017-01-26
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多