【问题标题】:Split JSON into multiple files将 JSON 拆分为多个文件
【发布时间】:2017-05-27 10:50:49
【问题描述】:

我有从 mongodb 导出的 json 文件,如下所示:

{"_id":"99919","city":"THORNE BAY"}
{"_id":"99921","city":"CRAIG"}
{"_id":"99922","city":"HYDABURG"}
{"_id":"99923","city":"HYDER"}

大约有 30000 行,我想将每一行拆分成它自己的 .json 文件。 (我正在尝试将我的数据传输到 couchbase 集群)

我试过这样做:

cat cities.json | jq -c -M '.' | \
while read line; do echo $line > .chunks/cities_$(date +%s%N).json; done

但我发现它似乎减少了很多行,运行此命令的输出只给了我 50 个奇怪的文件,而我期望有 30000 个奇怪的文件!!

有没有一种合乎逻辑的方法可以使用任何适合的方法来使其不丢弃任何数据?

【问题讨论】:

  • BSD date 不支持 %N 不到一秒。您正在丢失行数,因为您每秒只生成一次唯一的输出文件名,并且您每秒处理的行数远远超过一行。
  • Convertcsv.com 有一个工具可以拆分 CSV、文本或 JSON Lines/ND 文件,请参阅:convertcsv.com/text-split.htm

标签: json shell awk jq


【解决方案1】:

假设您不关心确切的文件名,如果您想将输入拆分为多个文件,只需使用split

jq -c . < cities.json | split -l 1 --additional-suffix=.json - .chunks/cities_

【讨论】:

  • 不太好用我得到split: illegal option -- - :(
  • 解决了你需要安装 coreutils 的 osx:brew install coreutils。然后使用gsplit 而不是split :)
  • 如果你真的不关心输出文件名,gsplit 只需要--additional-suffix 选项。
【解决方案2】:

一般来说,在任何 UNIX 系统上使用任何 awk 将任何文本文件每行拆分为单独的文件很简单:

awk '{close(f); f=".chunks/cities_"NR".json"; print > f}' cities.json

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 1970-01-01
    • 2017-09-05
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多