【问题标题】:how to refine jq output如何细化jq输出
【发布时间】:2019-01-31 10:23:13
【问题描述】:

我有一个 json 文件。一个简单的例子如下:

[
{
  "host": "a.com",
  "ip": "1.2.2.3",
  "port": 8,
  "name":"xyz"
},
{
  "host": "b.com",
  "ip": "2.5.0.4",
  "port": 3,
  "name":"xyz"

},
{
  "host": "c.com",
  "ip": "9.17.6.7",
  "port": 4,
  "name":"xyz"
}
]

我想提取“host”和“ip”值并将它们添加到逗号分隔值文件中。一行中的每条记录如下:

a.com,1.2.2.3
b.com,2.5.0.4
c.com,9.17.6.7

我安装了 jq 库来解析 json 文件。我执行了这个命令:

cat test.json | jq '.[] | {host: .host, ip: .ip}'

我得到的输出如下:

{
  "host": "a.com",
  "ip": "1.2.2.3"
}
{
  "host": "b.com",
  "ip": "2.5.0.4"
}
{
  "host": "c.com",
  "ip": "9.17.6.7"
}

有什么方法可以提取我想要的输出吗? jq 产生的这个输出需要额外的脚本来解析它,并以 csv 格式保存我想要的值,一行中的一项。

【问题讨论】:

  • @csv 运算符不正是你想要的吗?

标签: python json csv parsing jq


【解决方案1】:

要删除引号:

$ cat test.json | jq -r '.[] | [ .host, .ip ] | @csv' | sed 's/"//g'
a.com,1.2.2.3
b.com,2.5.0.4
c.com,9.17.6.7

如果使用 OS X,请使用 Homebrew 安装 GNU sed

【讨论】:

  • 在这种情况下,像这样使用 sed 无疑是可以接受的,但通常它可能会产生不正确的结果。一般来说,如果想要 CSV,最好使用 @csv 而不进行后处理,但如果确定值不包含逗号或双引号,则使用 jq 的字符串插值来避免引号可能是可以接受的: "(.host),(.ip)"
  • 公平评论。我只是认为主机名和 Internet 地址不会包含每个 RFC 952 的引号,所以这样做应该是安全的。在对其他字符串进行后处理时,一定要小心。 tools.ietf.org/html/rfc952
  • @peak 这会产生我想要的格式:jq -r '.[0] | "\(.host),\(.ip)"'。你觉得有什么问题吗?
【解决方案2】:

使用 @csv 格式从值数组生成 CSV 输出。

cat test.json | jq -r '.[] | [.host, .ip] | @csv'

需要-r 选项来获取原始输出而不是 JSON,后者会在结果周围附加一组引号并转义每个字段周围的引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 2016-04-22
    • 2013-11-03
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多