jq格式化对齐输出

把输出格式化,对齐。
例如,假设有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
=== =====   ======
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容