美文网首页
jq格式化对齐输出

jq格式化对齐输出

作者: CodingCode | 来源:发表于2021-10-01 07:53 被阅读0次

把输出格式化,对齐。
例如,假设有json数据:

[
  {
    "id": 1,
    "name": "Joe",
    "email": "joe@domain.com"
  },
  {
    "id": 5,
    "name": "Jack",
    "email": "jack@domain.com"
  },
  {
    "id": 10,
    "name": "George",
    "email": "george@domain.com"
  }
]

希望按行输出每一个数组内容:

  1. 自然输出

以四个空格作为分隔符输出。

$ cat t.json | jq -r '.[] | (.id|tostring) + "    " + .name + "    " + .email'
1    Joe    joe@domain.com
5    Jack    jack@domain.com
10    George    george@domain.com

这样明显看到数据是没法对齐的。

  1. 用tab键分割输出
$ cat t.json | jq -r '.[] | (.id|tostring) + "\t" + .name + "\t" + .email'
1   Joe     joe@domain.com
5   Jack    jack@domain.com
10  George  george@domain.com

这样就比较整齐了;
但是如果其中一个字很长,例如名字很长: 100 Tom Hanks hanks.tom@domain.com
结果就是:

$ cat t.json | jq -r '.[] | (.id|tostring) + "\t" + .name + "\t" + .email'
1   Joe     joe@domain.com
5   Jack    jack@domain.com
10  George  george@domain.com
100 Tom Hanks   hanks.tom@domain.com

可以看到Tom Hanks的名字过长,占用了其他行属于email的位置。

另外,使用tab键分割还有另外一种写法:

$ cat t.json | jq -r '.[] | "\(.id|tostring)\t\(.name)\t\(.email)"'
1   Joe     joe@domain.com
5   Jack    jack@domain.com
10  George  george@domain.com
100 Tom Hanks   hanks.tom@domain.com
  1. 指定列长度
$ cat t.json | jq -r '.[] | (.id | tostring | ("-" * (5 - length)) + .) + "  " + (.name | ("-" * (10 - length)) + .) + "  " + (.email | ("-" * (20 - length)) + .)'
----1  -------Joe  ------joe@domain.com
----5  ------Jack  -----jack@domain.com
---10  ----George  ---george@domain.com
--100  -Tom Hanks  hanks.tom@domain.com

这里为了说明方便,我使用了'-'作为占位符便于看清楚。这个语法我们定义:

  1. id字段占用5字符
  2. name字段占用10字符
  3. email字段占用20字符
  4. 各个字段之间用额外的两个空格分开。

解释一下语法(.name | ("-" * (10 - length)) + .)的含义:

  1. length值得是.name的值的长度
  2. ("-" * (10 - length))就是字符'-'重复(10-length)次
  3. 最后的.在这里就是.name字段的值。
    所以整个.name占用10字符长度,前缀-占用10-length(.name)长度,余下的正好就是.name自己的长度。
  1. 使用@tsv
$ cat t.json | jq -r '.[] | [.id, .name, .email] | @tsv'
1   Joe joe@domain.com
5   Jack    jack@domain.com
10  George  george@domain.com
100 Tom Hanks   hanks.tom@domain.com

可以加表头:

$ cat t.json | jq -r '["ID", "NAME", "EMAIL"], ["----", "------", "------"], (.[] | [.id, .name, .email]) | @tsv'
ID  NAME    EMAIL
----    ------  ------
1   Joe     joe@domain.com
5   Jack    jack@domain.com
10  George  george@domain.com
100 Tom Hanks   hanks.tom@domain.com

也可以加表尾:

$ cat t.json | jq -r '["ID", "NAME", "EMAIL"], ["----", "------", "------"], (.[] | [.id, .name, .email]), ["===", "=====", "======"] | @tsv'
ID  NAME    EMAIL
----    ------  ------
1   Joe     joe@domain.com
5   Jack    jack@domain.com
10  George  george@domain.com
100 Tom Hanks   hanks.tom@domain.com
=== =====   ======

相关文章

  • jq格式化对齐输出

    把输出格式化,对齐。例如,假设有json数据: 希望按行输出每一个数组内容: 自然输出 以四个空格作为分隔符输出。...

  • Python3 - 数字的格式化输出

    问题 将数字格式化后输出,并控制数字的位数、对齐、千位分隔符和其他的细节。 解决方案 格式化输出单个数字的时候,可...

  • 2018-02-21-Python下单格式化输出

    前言 用python上某浴谷oj刷题,然后在格式化输出炸了 字符串拼接大法不能设置左对齐右对齐和小数后补齐,然后思...

  • Python 字符串格式化

    字符串格式化 对于如何输出格式化的字符串,是一个常见的问题。有时需要对字符串进行对齐,或者按照指定的列宽格式化字符...

  • phpstorm代码格式化设置

    格式化代码 变量按等号=对齐 数组键值对按=>对齐 格式化代码 选择Reformat Code后,phpStorm...

  • 5.格式化数字

    # 格式化数字 .nf保留n位小数 # [填充] [对齐:左对齐<、居中^、右对齐>] [符号: +\-] [宽度...

  • jq命令 - json文本处理

    jq可以对json数据进行分片、过滤、映射和转换 安装 提取信息 格式化展示原文 输出数组中的元素,可以使用[in...

  • PhpStorm 快捷键

    phpstorm设置格式化等号对齐

  • centos7安装jq

    jq linux json格式化工具添加epel源

  • Python学习-格式化

    查看所有Python相关学习笔记 格式化学习 格式化 %数字代表长度,正数是右对齐,负数是左对齐%s -->str...

网友评论

      本文标题:jq格式化对齐输出

      本文链接:https://www.haomeiwen.com/subject/edgynltx.html