如何用脚本从文本文件提取指定字段并排序写入新文件
解决方案
处理JSON格式的数据,优先用jq工具,比正则更稳定可靠,不会因为JSON结构的小变化(比如键值顺序调换、换行)失效。直接执行以下命令即可完成需求:
jq -r '.[] | [.key, .project, .author, .type] | @tsv' myfile.txt | sed 's/\t/ /g' > mynewfile.txt
命令说明:
-r:让jq输出原始字符串,不会给字段套JSON引号.[]:遍历输入JSON数组中的每一条数据(如果你的扫描数据是包裹在数组里的,这一步会逐个处理每条记录)[.key, .project, .author, .type]:从每条记录里提取指定的四个字段,组成一个数组@tsv:把数组转换成制表符分隔的字符串,保证字段对齐sed 's/\t/ /g':将制表符替换成四个空格,匹配你想要的输出格式(如果允许用制表符分隔,这一步可以省略)
如果你的JSON结构不是顶层数组(比如数据嵌套在某个字段下,比如.results[]),只需要修改jq的路径即可,比如改成:
jq -r '.results[] | [.key, .project, .author, .type] | @tsv' myfile.txt | sed 's/\t/ /g' > mynewfile.txt
无jq环境的替代方案
如果系统里没装jq,可以用awk结合正则处理(仅适合JSON格式非常规整的场景,比如键值对单行排列、顺序固定):
awk -F'"' '{ key = project = author = type = "" for(i=1; i<=NF; i++){ if($i == "key") key = $(i+2) else if($i == "project") project = $(i+2) else if($i == "author") author = $(i+2) else if($i == "type") type = $(i+2) } printf "%-20s %-20s %-25s %s\n", key, project, author, type }' myfile.txt > mynewfile.txt
这个脚本用双引号分割每行内容,逐个匹配目标键名,提取对应的值,最后用printf格式化输出,保证字段对齐。
内容的提问来源于stack exchange,提问作者Zero5
相关产品推荐
相关产品推荐

