如何使用jq处理含JSON列的多列TSV并输出其余原始列?
多列TSV混合JSON内容的jq处理方案
问题场景
处理单列全为JSON内容的TSV时,可以直接用如下命令提取字段:
jq --slurp '.[] | .a' <<< '{"a": 1}'$'\n''{"a": 2}'
输出结果:
1 2
但当TSV存在多列,其中一列为JSON格式时,直接用上述命令会触发解析报错:
jq --slurp '.[] | .a' <<< $'A\t{"a": 1}'$'\n''B\t{"a": 2}'
报错内容:
parse error: Invalid numeric literal at line 1, column 2
报错原因
jq默认会把输入的每行内容当做JSON格式解析,多列TSV的非JSON列内容不符合JSON语法,因此触发解析错误。
解决方案
使用jq的原始输入模式先按行读取纯文本,拆分制表符后再单独解析JSON列即可。
场景1:输出第一列 + 第二列JSON的a字段(制表符分隔)
命令:
jq -r 'split("\t") | [.[0], (.[1] | fromjson.a)] | @tsv' <<< $'A\t{"a": 1}'$'\n''B\t{"a": 2}'
输出:
A 1 B 2
场景2:保留所有原始列 + 追加提取的JSON字段
命令:
jq -r 'split("\t") | . + [.[1] | fromjson.a] | @tsv' <<< $'A\t{"a": 1}'$'\n''B\t{"a": 2}'
输出:
A {"a": 1} 1 B {"a": 2} 2
命令说明
-r/--raw-output:输出原始字符串,不会给结果自动添加多余的双引号split("\t"):将每行纯文本按制表符拆分为数组,数组下标从0开始对应TSV的列顺序fromjson:将指定列的JSON字符串解析为可操作的JSON对象@tsv:自动将数组内容转换为标准TSV格式,自动处理特殊字符转义,无需手动拼接分隔符
内容的提问来源于stack exchange,提问作者user1424739
相关产品推荐
相关产品推荐

