需要帮助使用 awk 或类似方法打印/输出 JSON 文件的部分行



在下面的示例中,我需要重新调整第5 行第2 组引号内的内容,最多但不超出小数点。

引号的内容各不相同,因此必须捕获".之间的所有内容,并且不能使用基于两者之间任何内容的搜索字符串进行匹配。

将来行号也可能会更改,但是,始终可以通过搜索"项目"找到该行。

由于专有环境/操作系统的限制,该过程应该利用awkgrepcatsed或它们的组合。我已经四处搜索,但找不到任何可以按预期工作的东西。

文件名: data.json

{
"Brand": "Marketside",
"Price": "3.97",
"SKU": "48319448",
"Item": "12-ct_Large_Grade_A(Brown_Organic).48319448",
}

成功输出的示例如下:

12-ct_Large_Grade_A(Brown_Organic)

完全依赖面向行的工具来操作JSON的要求似乎非常误导。操作结构化格式时,请使用了解结构化格式的工具。

jq '.Item|split(".")[0]' data.json

提取到第一个点;或

jq '.Item|sub("[.][^.]*$";"")' data.json

以放弃从最后一个点到字段末尾的文本。

(不过,jq不喜欢伪 JSON 中Item后面多余的最后一个逗号。

毫无疑问,任何人都认为,您所说的尖锐问题可以通过简单的 Awk 或sed脚本来解决。然后发生的事情 - 这里已经发生的事情 - 是你发现了额外的要求,这些要求在你发布的玩具示例中并不明显。一个适当的、可移植的解决方案可以处理带有嵌入逗号和转义双引号的字符串的 JSON 示例,并在表面 JSON 格式发生变化时继续工作,因为上游某处的组件被更新为将所有 JSON 放在一行或其他任何内容上。

这是一个尴尬:

awk -F'.' '/Item/{split(substr($0,1,L=length($0)-length($NF)-1),a,""");print a[4]}'
12.ct.Large.Grade.A(Brown_Organic)

它搜索Item,然后从"打印到最新.

.
拆分字符串 查找拆分后最新部分的长度length($NF)
从总数中提取此长度以查找最新.length($0)-length($NF)
的位置 然后将第一部分拆分"并打印第四部分。

最新更新