美文网首页
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格式化对齐输出

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