如何使用jq将对象数组按IPv4地址值作为32位整数进行排序,而不是按字母数字排序?

下面是我所指的一些额外格式的插图,以确保视觉清晰度:

$ echo '
    {"name": "dns", "ip": "4.4.4.4"}
    {"name": "host1", "ip": "10.9.9.9"}
    {"name": "host2", "ip": "10.10.10.10"}
' |jq -sr '.|=sort_by(.ip) |.[] |[.name, .ip] |@tsv'

host2   10.10.10.10
host1   10.9.9.9
dns 4.4.4.4

|=sort_by(.ip)个按字母数字顺序排序,但我希望数组按"IPnumber"排序.如果我有这样的TSV格式,我可以使用外部工具(例如sort的这个非POSIX-V扩展)在外部完成这项工作,但是有没有办法在jq内完成这项工作?

$ echo '
    {"name": "dns", "ip": "4.4.4.4"}
    {"name": "host1", "ip": "10.9.9.9"}
    {"name": "host2", "ip": "10.10.10.10"}
    ' |jq -sr '.|=sort_by(.ip) |.[] |[.name, .ip] |@tsv' |sort -t$'\t' -Vk2
dns 4.4.4.4
host1   10.9.9.9
host2   10.10.10.10

推荐答案

您只需拆分IP并将其转换为一组数字:

sort_by(.ip | split(".")[] | tonumber)

完整命令(请注意,不需要重新分配开头的(.|=)):

$ echo '
    {"name": "dns", "ip": "4.4.4.4"}
    {"name": "host1", "ip": "10.9.9.9"}
    {"name": "host2", "ip": "10.10.10.10"}
' | jq -sr 'sort_by(.ip | split(".")[] | tonumber) | .[] | [.name, .ip] | @tsv'

dns 4.4.4.4
host1   10.9.9.9
host2   10.10.10.10

Json相关问答推荐

抓取低于w jolt的对象级别

写入JSON文件的流

在Ansible中从json中提取特定数据

序列化从/到空值

Jolt-Json转换:通过引用标识符(而不是索引)设置值

JOLT分裂和数组数据

如何在 Apache NiFi 中使用 JoltTransformJson 删除流文件或具有空字段的整个对象?

jq :当路径可变时更新 json 内容

打印与 JSON 和 PowerShell 中的模式匹配的子项的父项名称

如果有 1 个元素,如何防止 ConvertFrom-Json 折叠嵌套数组

Powershell 无法从名为 count 的键中获取价值

为什么JsonConvert反序列化对象以int但不长失败

JSON extract\set 的 SQLite JSON1 示例

使用 simplejson 序列化简单类对象的最简单方法?

以 unicode 将 pandas DataFrame 写入 JSON

Android JSON 库的性能和可用性比较

使用 Retrofit 解析动态密钥 Json 字符串

在 Java 中比较两个 JSON 文件的最佳方法

使用 Codable 序列化为 JSON 时的 Swift 字符串转义

Laravel 5 控制器将 JSON 整数作为字符串发送