如何避免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
相关产品推荐
相关产品推荐

