如何精简将文本表格转为JSON的JQ表达式?
精简空格分隔文本转JSON的JQ命令
原始输入文本
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT lava1 pts/0 157.48.149.102 05:03 31.00s 0.31s 0.31s -bash azureuse pts/1 157.48.149.102 07:26 0.00s 0.07s 0.05s w
原JQ命令(冗余版)
jq -sRre 'split("\n") | map(split(" ") | map( select( (. | length) > 0) ) ) | map( select( (.|length) > 0 ) ) | .[0] as $cols | .[1:] | map(. as $row | $cols | with_entries({ "key": .value,"value": $row[.key]}) )'
预期输出
[ { "USER": "lava1", "TTY": "pts/0", "FROM": "157.48.149.102", "LOGIN@": "05:03", "IDLE": "31.00s", "JCPU": "0.31s", "PCPU": "0.31s", "WHAT": "-bash" }, { "USER": "azureuse", "TTY": "pts/1", "FROM": "157.48.149.102", "LOGIN@": "07:26", "IDLE": "0.00s", "JCPU": "0.07s", "PCPU": "0.05s", "WHAT": "w" } ]
问题分析
原命令需要两次拆分并过滤空数组,冗余度高;单独使用jq -R 'split("\\s+"; "g")'会输出多个独立数组,无法关联表头与数据行的对应关系。
精简后的JQ命令
jq -sR 'split("\n") | map(select(length>0) | split("\\s+"; "g")) | .[0] as $cols | .[1:] | map([$cols, .] | transpose | from_entries)'
精简逻辑说明
-sR:将所有输入文本读取为单个字符串,并按行处理split("\n"):按换行符拆分所有行map(select(length>0) | split("\\s+"; "g")):一步完成空行过滤+按任意空白字符拆分每行内容,替代原命令的两次拆分过滤操作.[0] as $cols:提取第一行作为表头字段集合.[1:]:取剩余行作为数据行集合map([$cols, .] | transpose | from_entries):将表头与对应数据行转置后直接生成键值对对象,替代原命令中冗余的with_entries写法,逻辑更简洁直观
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

