基于条件从JSON文件提取指定字段的AWK代码优化需求
解决方案:提取JSON中指定字段的AWK优化代码
针对你的需求,优化后的AWK代码可以准确筛选出Dmo = Path的块,并按预期格式输出:
BEGIN { FS = "\"" # 以双引号作为分隔符,直接提取引号内的内容 } /"Filename":/ { filename = $4 # 捕获引号包裹的文件名 has_path = 0 # 标记当前文件是否存在符合条件的块 } /"Dmo": "Path"/ { in_path_block = 1 # 标记当前进入Dmo=Path的块 } /"Value":/ && in_path_block { value = $4 printf "%s, %s\n", filename, value has_path = 1 in_path_block = 0 # 处理完当前Value后重置标记 } /^}/ { # 每个JSON文件结束时检查标记 if (!has_path) { print filename } # 重置所有标记,准备处理下一个文件 filename = "" has_path = 0 in_path_block = 0 }
代码说明
FS = "\"":将分隔符设为双引号,避免处理多余的逗号、空格,直接提取引号内的有效内容/"Filename":/:捕获文件名,同时初始化has_path标记/"Dmo": "Path"/:标记当前处于目标块中,后续仅处理此块内的Value字段/"Value":/ && in_path_block:仅在目标块内提取Value,按格式输出文件名+Value,并标记当前文件存在符合条件的块/^}/:JSON文件结束时,若未找到目标块,单独输出文件名
执行结果
将代码保存为extract.awk,执行命令 awk -f extract.awk input,输出与预期完全一致:
File_213, /Files/2024/abd File_213, /Files/2024/Ndew File_4 File_43, /Files/2023/Roi2
补充说明
如果JSON格式更复杂(比如嵌套层级深、换行不固定),建议使用专门的JSON处理工具jq,实现更简洁可靠:
jq -r ' .Filename as $fn | (.Blocks[] | select(.Dmo == "Path") | .Value) as $val | if $val then "\($fn), \($val)" else $fn end ' input
若必须使用AWK,上述优化代码可满足当前需求。
内容的提问来源于stack exchange,提问作者Rasec Malkic
相关产品推荐
相关产品推荐

