如何使用JQ实现JSON字段单词首字母大写并保留LLC类缩写大写
JQ 实现字段首字母大写格式化方案
核心实现逻辑
- 自定义
titlecase函数实现通用的「单词首字母大写、其余字母小写」转换,专门用于brand_name、generic_name两个字段的格式化 - 对
manufacturer字段先执行通用首字母大写转换,再通过正则匹配将指定商业缩写替换回全大写格式,避免LLC这类固定缩写被错误转成首字母大写格式 - 完全保留原有语句的筛选逻辑,不需要调整前置过滤规则
完整执行命令
直接替换原有的jq语句即可:
jq ' # 自定义标题大小写转换函数 def titlecase: ascii_downcase | split(" ") | map(if length == 0 then . else (.[:1] | ascii_upcase) + .[1:] end) | join(" "); .results[] | select(.openfda.brand_name != null or .openfda.generic_name != null or .openfda.rxcui != null) | select(.openfda | has("rxcui")) | { brand_name: (.openfda.brand_name[0] | titlecase), generic_name: (.openfda.generic_name[0] | titlecase), manufacturer: ( .openfda.manufacturer_name[0] | titlecase | gsub("(?<![a-zA-Z])Llc(?![a-zA-Z])"; "LLC") # 新增其他保留缩写参照下面格式即可 # | gsub("(?<![a-zA-Z])Inc(?![a-zA-Z])"; "Inc") # | gsub("(?<![a-zA-Z])Ltd(?![a-zA-Z])"; "Ltd") ), rxcui: .openfda.rxcui[0] } ' filename.json > newfile.json
输出效果
执行后得到的结果和预期完全一致:
{ "brand_name": "Veltin", "generic_name": "Clindamycin Phosphate And Tretinoin", "manufacturer": "Almirall, LLC", "rxcui": "882548" }
补充说明
- 正则匹配缩写用了零宽断言,只会匹配独立出现的缩写字符串,不会误替换单词内部包含的同名字符
- 如果字段里存在连字符、斜杠连接的单词需要特殊首字母大写,可以调整
titlecase函数的拆分规则适配 - 处理大文件时该逻辑不会额外增加明显性能开销,和原有语句的执行效率基本一致
内容的提问来源于stack exchange,提问作者kittonian
相关产品推荐
相关产品推荐

