jq格式化对齐输出

2021-10-01  本文已影响0人  CodingCode

把输出格式化,对齐。
例如,假设有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
=== =====   ======
上一篇下一篇

猜你喜欢

热点阅读