AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 754935
Accepted
Daniel Krajnik
Daniel Krajnik
Asked: 2023-08-26 01:23:40 +0800 CST2023-08-26 01:23:40 +0800 CST 2023-08-26 01:23:40 +0800 CST

将 json 转换为 csv,并在 jq 中标头

  • 772

是否可以转换这个json:

[
    {
        "bytes": 276697,
        "checked": false
    },
    {
        "bytes": 276697,
        "checked": false
    }
]

到 jq 中带有标题的表?

我试过了:

cat file.json | jq '.[] | join(",")'

但它省略了标题:

"276697,false"
"276697,false"

它应该是:

"bytes,checked"
"276697,false"
"276697,false"

我希望您只需运行两个命令:

cat file.json | jq '.[] | keys, .[] | join(",")'

但第二个失败了:

"bytes,checked"
jq: error (at <stdin>:64): Cannot iterate over null (null)

理想情况下它会比这更简单。

csv
  • 2 2 个回答
  • 71 Views

2 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2023-08-26T03:07:07+08:002023-08-26T03:07:07+08:00

    您可以从列表中第一个元素的键中选择标题作为字符串数组,然后将所有元素的值提取为单独的数组。将@csv输出运算符应用于结果列表的每个元素将以 CSV 形式引用数据(jq引用所有字符串,但不引用布尔值或数字):

    $ jq -r '[first|keys] + map([.[]]) | .[] | @csv' file
    "bytes","checked"
    276697,false
    276697,false
    

    或者,

    $ jq -r '(first|keys), (.[]|[.[]]) | @csv' file
    "bytes","checked"
    276697,false
    276697,false
    

    或者,

    $ jq -r '(first|keys), map(map(.))[] | @csv' file
    "bytes","checked"
    276697,false
    276697,false
    

    或任何其他方式将值提取到单独的数组中。

    请注意,这依赖于整个输入数据中的键以相同的顺序出现。

    然而,使用Miller ( )则更容易mlr:

    $ mlr --j2c cat file
    bytes,checked
    276697,false
    276697,false
    

    这只是通过 Miller 的命令传递数据cat(这样使用时,不会修改数据),同时使用选项--j2c(缩写--ijson --ocsv)将数据从 JSON 转换为 CSV。请注意,由于 Miller 能够正确识别 CSV,因此它仅引用实际需要引用的字段。

    您还可以通过选择漂亮的打印输出格式以及以下命令来获得格式良好的表格--barred:

    $ mlr --j2p --barred cat file
    +--------+---------+
    | bytes  | checked |
    +--------+---------+
    | 276697 | false   |
    | 276697 | false   |
    +--------+---------+
    

    (--j2p是 的缩写--ijson --opprint。)

    或者没有--barred:

    $ mlr --j2p cat file
    bytes  checked
    276697 false
    276697 false
    
    • 4
  2. Daniel Krajnik
    2023-08-26T01:47:38+08:002023-08-26T01:47:38+08:00

    我得到了它:

    cat file.json | jq '(.[0] | keys), .[] | join(",")'
    

    看起来你可以将任何部分放在括号中,以防止它“消耗”流(我不知道这是否是它的名字,或者即使我在这里得到它,因为我在 jq 的文档中找不到任何内容并且有将所有内容与分散在各个博客和 stackoverflow 中的零碎内容拼凑在一起,因此,如果有“正确”的方法来做到这一点,请告诉我)。

    顺便说一句,如果你有一个像我一样的 shell for 循环,使用 -s 选项来组合单独的 json 对象:

    $ for i in {3,4,5,8} 
    do rclone rc core/stats --rc-user USER --rc-pass PASS --rc-addr :557$i
    done | jq -rs '(.[0] | keys), .[] | join(",")' | column -ts,
    
    bytes      checks  deletedDirs  deletes  elapsedTime       errors  eta  fatalError  renames  retryError  speed               totalBytes  totalChecks  totalTransfers  transferTime  transfers
    1660182    0       0            0        258038.009782457  0       0    false       0        false       1664.9322505627426  1660182     0            6               0             6
    407752609  0       0            0        258038.054874325  0       0    false       0        false       10615.04533495996   407752609   0            86              0             86
    7403585    0       0            0        258038.103563555  0       0    false       0        false       20892.381593377457  7403585     0            2               0             2
    0          0       0            0        258038.156466825  0            false       0        false       0                   0           0            0               0             0
    
    
    • 2

相关问题

  • 在某些字符前添加逗号

  • 比较 2 个 csv 文件并仅将差异输出到变量中

  • 在没有工具的情况下在 AIX 中将 xlsx 转换为 csv [关闭]

  • 通过将前一行与当前和次要计算进行比较来转换现有的 .CSV

  • 检查文本文件是否包含所有条目并且格式正确

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve