You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免JQ字段值因列值缺失发生左移?

JSON转表格时空字段导致值左移的解决办法

问题描述

我有如下JSON对象,需要转换为表格:

[
  {
    "name": "Jay",
    "Age": "23"
  },
  {
    "name": "Jamie",
    "Age": "32"
  },
  {
    "name": "",
    "Age":"26"
  }
]

转换时出现异常:当某列值为空时,下一列的值会左移填充该位置,比如第3条数据的Age值26跑到了name列,生成的错误表格如下:

|  |name  | Age |
|--|----  | ----|
|1.| Jay  | 23  |
|2.| Jamie| 32  |
|3.|  26  |     |

我的JSON存储在变量listofres中,当前使用的处理脚本如下:

echo "$listofres" 
| jq -r '.[] | [.["name"], .["Age"]] | @tsv' 
| awk 'BEGIN { printf "%-2s %-20s %-20s\n", "","Name", "Age"; 
print "---------------------------------------"} 
{printf "%-2s. %-20s %-20s\n", (NR < 10 ? " " : "")NR, $1, $2}'

如何阻止这种字段值左移的情况?


解决方案

问题根源在于awk默认的字段处理逻辑:它会把空字符串当成无值字段,自动将后续字段左移。要解决这个问题,需要让awk正确识别TSV的制表符分隔,同时保留空字段的位置。

修改后的完整脚本:

echo "$listofres" \
| jq -r '.[] | [.["name"], .["Age"]] | @tsv' \
| awk 'BEGIN {
    FS = "\t"  # 明确指定制表符为字段分隔符
    printf "%-2s %-20s %-20s\n", "", "Name", "Age";
    print "---------------------------------------"
  }
  {
    # 直接输出字段,空位置会被保留
    printf "%-2s. %-20s %-20s\n", (NR < 10 ? " " : "")NR, $1, $2
  }'

核心修改说明

  • 指定分隔符:在awk的BEGIN块中设置FS = "\t",强制awk使用制表符分割字段。这样即使第一个字段是空字符串,也会被识别为$1,不会把$2的值偏移到$1的位置。
  • 保留空字段:只要正确设置了分隔符,awk就会自然保留空字段的位置,无需额外判断,直接输出对应字段即可得到正确的表格。

修改后生成的正确表格:

Name                 Age                 
---------------------------------------
 1. Jay                  23                  
 2. Jamie                32                  
 3.                      26                  

内容的提问来源于stack exchange,提问作者CGBoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:13:13