jq格式化對(duì)齊輸出

把輸出格式化,對(duì)齊。
例如,假設(shè)有json數(shù)據(jù):

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

希望按行輸出每一個(gè)數(shù)組內(nèi)容:

  1. 自然輸出

以四個(gè)空格作為分隔符輸出。

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

這樣明顯看到數(shù)據(jù)是沒法對(duì)齊的。

  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

這樣就比較整齊了;
但是如果其中一個(gè)字很長(zhǎng),例如名字很長(zhǎng): 100 Tom Hanks hanks.tom@domain.com
結(jié)果就是:

$ 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的名字過長(zhǎng),占用了其他行屬于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. 指定列長(zhǎng)度
$ 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

這里為了說明方便,我使用了'-'作為占位符便于看清楚。這個(gè)語法我們定義:

  1. id字段占用5字符
  2. name字段占用10字符
  3. email字段占用20字符
  4. 各個(gè)字段之間用額外的兩個(gè)空格分開。

解釋一下語法(.name | ("-" * (10 - length)) + .)的含義:

  1. length值得是.name的值的長(zhǎng)度
  2. ("-" * (10 - length))就是字符'-'重復(fù)(10-length)次
  3. 最后的.在這里就是.name字段的值。
    所以整個(gè).name占用10字符長(zhǎng)度,前綴-占用10-length(.name)長(zhǎng)度,余下的正好就是.name自己的長(zhǎng)度。
  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
=== =====   ======
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容