Bash / * NIX:将文件拆分为子字符串上的多个文件
之前已经问过并回答过这个问题的变种,但是我发现我的sed / grep / awk技能从那些工作到自定义解决方案都太基础了,因为我几乎没有在
shell脚本中工作.
我有一个相当大的(100K行)文本文件,其中每行定义一个GeoJSON对象,每个这样的对象包括一个名为“county”的属性(总共有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.848302],[-79.537429,35.843303]]]}},{"type": "Feature","properties": {"county":"NEW HANOVER","vWHI": 0,"vREP": 0,"vUNA": 0,"vTOT": 0},"coordinates":[[[-79.532429,[-79.537428,[-79.532429,"coordinates":[[[-79.527429,[-79.532428,[-79.527429, 我需要将其拆分为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似乎没有显示任何输出函数的请求,可以让你打开并从jq过滤器内部写入文件.我在想类似的东西 jq -Rn '... | group_by(.properties.county) | output("(.properties.county).txt")' tmp.json 不需要shell循环.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |