You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精简将文本表格转为JSON的JQ表达式?

精简空格分隔文本转JSON的JQ命令

原始输入文本

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
lava1    pts/0    157.48.149.102   05:03   31.00s  0.31s  0.31s -bash
azureuse pts/1    157.48.149.102   07:26    0.00s  0.07s  0.05s w

原JQ命令(冗余版)

jq -sRre 'split("\n") |
map(split(" ") |
map(
    select(
        (. | length) > 0)
    )
) |
map(
    select(
        (.|length) > 0
    )
) |
.[0] as $cols
| .[1:]
| map(. as $row
  | $cols
  | with_entries({ "key": .value,"value": $row[.key]})
)'

预期输出

[
  {
    "USER": "lava1",
    "TTY": "pts/0",
    "FROM": "157.48.149.102",
    "LOGIN@": "05:03",
    "IDLE": "31.00s",
    "JCPU": "0.31s",
    "PCPU": "0.31s",
    "WHAT": "-bash"
  },
  {
    "USER": "azureuse",
    "TTY": "pts/1",
    "FROM": "157.48.149.102",
    "LOGIN@": "07:26",
    "IDLE": "0.00s",
    "JCPU": "0.07s",
    "PCPU": "0.05s",
    "WHAT": "w"
  }
]

问题分析

原命令需要两次拆分并过滤空数组,冗余度高;单独使用jq -R 'split("\\s+"; "g")'会输出多个独立数组,无法关联表头与数据行的对应关系。

精简后的JQ命令

jq -sR 'split("\n") | map(select(length>0) | split("\\s+"; "g")) | .[0] as $cols | .[1:] | map([$cols, .] | transpose | from_entries)'

精简逻辑说明

  1. -sR:将所有输入文本读取为单个字符串,并按行处理
  2. split("\n"):按换行符拆分所有行
  3. map(select(length>0) | split("\\s+"; "g")):一步完成空行过滤+按任意空白字符拆分每行内容,替代原命令的两次拆分过滤操作
  4. .[0] as $cols:提取第一行作为表头字段集合
  5. .[1:]:取剩余行作为数据行集合
  6. map([$cols, .] | transpose | from_entries):将表头与对应数据行转置后直接生成键值对对象,替代原命令中冗余的with_entries写法,逻辑更简洁直观

内容的提问来源于stack exchange,提问作者Christian Bongiorno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:44:56