gpt4 book ai didi

bash/*NIX : split a file into multiple files on a substring

转载 作者:行者123 更新时间:2023-11-29 09:06:49 24 4
gpt4 key购买 nike

这个问题的变体已经被询问和回答过,但我发现我的 sed/grep/awk 技能太初级了,无法从这些技能到自定义解决方案,因为我几乎从不使用 shell 脚本。

我有一个相当大(超过 10 万行)的文本文件,其中每一行都定义了一个 GeoJSON 对象,每个这样的对象都包含一个名为“县”的属性(总共有 100 个不同的县)。这是一个片段:

{"type": "Feature", "properties": {"county":"ALAMANCE", "vBLA": 0, "vWHI": 4, "vDEM": 0, "vREP": 2, "vUNA": 2, "vTOT": 4}, "geometry": {"type":"Polygon","coordinates":[[[-79.537429,35.843303],[-79.542428,35.843303],[-79.542428,35.848302],[-79.537429,35.848302],[-79.537429,35.843303]]]}},
{"type": "Feature", "properties": {"county":"NEW HANOVER", "vBLA": 0, "vWHI": 0, "vDEM": 0, "vREP": 0, "vUNA": 0, "vTOT": 0}, "geometry": {"type":"Polygon","coordinates":[[[-79.532429,35.843303],[-79.537428,35.843303],[-79.537428,35.848302],[-79.532429,35.848302],[-79.532429,35.843303]]]}},
{"type": "Feature", "properties": {"county":"ALAMANCE", "vBLA": 0, "vWHI": 0, "vDEM": 0, "vREP": 0, "vUNA": 0, "vTOT": 0}, "geometry": {"type":"Polygon","coordinates":[[[-79.527429,35.843303],[-79.532428,35.843303],[-79.532428,35.848302],[-79.527429,35.848302],[-79.527429,35.843303]]]}},

我需要将其拆分为 100 个单独的文件,每个文件包含一个县的 GeoJSON,每个文件都命名为 xxxx_bins_2016.json(其中 xxxx 是该县的名称)。我还希望每个此类文件末尾的最后一个字符(逗号)消失。

如果重要的话,我正在 Mac OSX 中执行此操作。我希望通过研究您可能建议的任何解决方案来学到很多东西,所以如果您愿意花时间解释“为什么”以及“什么”,那将是非常棒的。谢谢!

编辑以明确存在不同的县名,其中一些是两个词的名称。

最佳答案

jq可以这样做吗?它可以将输入分组,每组输出一行文本。然后 shell 负责将每一行写入一个适当命名的文件。 jq本身并没有真正打开文件进行写入的能力,这将允许您在单个进程中执行此操作。

jq -Rn -c '[inputs[:-1]|fromjson] | group_by(.properties.county)[]' tmp.json |
while IFS= read -r line; do
county=$(jq -r '.[0].properties.county' <<< $line)
jq -r '.[]' <<< "$line" > "$county.txt"
done

[inputs[:-1]|fromjson]将文件的每一行作为字符串读取,去除尾随的逗号,然后将行解析为 JSON 并将这些行包装到一个数组中。生成的数组按县名排序和分组,然后写入标准输出,每行一组。

shell 循环读取每一行,通过调用 jq 从组的第一个元素中提取县名, 然后使用 jq再次将组中的每个元素写入适当的文件,每行一个元素。

(快速浏览一下 https://github.com/stedolan/jq/issues 似乎还没有显示对 output 函数的任何请求,该函数可以让您从 jq 过滤器内部打开和写入文件。我在想一些事情喜欢

jq -Rn '... | group_by(.properties.county) | output("\(.properties.county).txt")' tmp.json

不需要 shell 循环。)

关于 bash/*NIX : split a file into multiple files on a substring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42444820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com