2017-05-27 315 views
2

我从MongoDB的出口JSON文件,它看起来像: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 

,但我发现,它似乎下降线的负载和运行此命令的输出只当我期待30000奇怪时,给了我50个奇怪的文件!

有没有一种合乎逻辑的方式来使这不会使用任何套件将任何数据删除?

+1

BSD'date'不支持'%N'作为几分之一秒。由于每秒只生成一次唯一的输出文件名,并且每秒处理的行数远远超过一行,所以会丢失行数。 – chepner

回答

3

假设你不关心确切的文件名,如果你想分割输入到多个文件,只需使用split

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

不太合适我得到'split:非法选项 - -' :( – cmdv

+1

解决了osx需要安装coreutils:'brew install coreutils'。然后使用'gsplit'而不是'split': ) – cmdv

+1

如果你真的不关心输出文件名,'gsplit'只对'--additional-suffix'选项是必需的。 – chepner

1

一般而言任何文本文件分割成每行使用任何UNIX系统上的任何AWK单独的文件很简单:

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