2016-05-17 109 views
0

我有一个包含的如何分割文本行,并使用一个部分作为文件名,另一部分为文件内容

// dbname.filename.json[{"some":"very long", "...":"...", "JSON":"string"}] 

// dbname.other_filename.json[{"sdfs":"dfdv", "...":"...", "osifu":"cvvcb"}] 

// dbname.yet_another_filename.json[{"vcv":"t54tr", "...":"...", "yugf":"hft"}] 

我想表格线大文本文件large.txt使用Bash将大文件拆分成JSON文件,每个JSON文件都在文件行的开头。在上面的例子中,这将是filename.json。我只得到了这里

grep '^\/\/ dbname\.' large.txt | sed -r 's#// dbname\.##' 

有没有办法来分割文本行,并使用一个部分作为文件名,另一部分为文件内容?

其结果将是,例如

  • 文件filename.json只包含字符串[{"some":"very long", "...":"...", "JSON":"string"}]
  • 文件other_filename.json仅ontaining字符串[{"sdfs":"dfdv", "...":"...", "osifu":"cvvcb"}]
+1

应该将'[{“some”:“very long”,“...”:“...”,“JSON”:“string”}]存储在filenames.json中吗? JSON数据总是在同一行吗? – anubhava

+0

是的,确切地说。每一行由紧接着一串JSON数据的'dbname.filename.json'组成,全部在一行中。生成的文件应该包含该JSON字符串,并应根据行首的文件名命名。 – C14L

+1

增加了一些更详细的问题。 – C14L

回答

1

扩展了您的管道,我们得到:

grep '^\/\/\s*dbname\.' large.txt | sed -r 's#//\s*dbname\.##;s/\[/>[/1' | awk -F '>' '{for(i=2;i<=NF;i++) print $i >> $1}' 

输出:

$ cat large.txt 
// dbname.filename.json[{"some":"very long", "...":"...", "JSON":"string"}] 

// dbname.other_filename.json[{"sdfs":"dfdv", "...":"...", "osifu":"cvvcb"}] 

// dbname.yet_another_filename.json[{"vcv":"t54tr", "...":"...", "yugf":"hft"}] 
$ ls 
large.txt 
$ grep '^\/\/\s*dbname\.' large.txt | sed -r 's#//\s*dbname\.##;s/\[/>[/1' | awk -F '>' '{for(i=2;i<=NF;i++) print $i >> $1}' 
$ ls 
filename.json large.txt other_filename.json yet_another_filename.json 
$ cat filename.json 
[{"some":"very long", "...":"...", "JSON":"string"}] 
$ cat other_filename.json 
[{"sdfs":"dfdv", "...":"...", "osifu":"cvvcb"}] 
$ cat yet_another_filename.json 
[{"vcv":"t54tr", "...":"...", "yugf":"hft"}] 
+0

谢谢!只是一个细节,结果字符串缺少'[]'。 – C14L

+0

@ C14L固定它.. – ritesht93

0

您可以使用自定义字段分隔这个简单的awk命令:

awk -F '\\.json' 'NF==2{sub(/.*\./, "", $1); print $2 > $1 ".json"}' file 

随着您的样本数据,将创建3个.json文件:

yet_another_filename.json 
other_filename.json 
filename.json 
1

你可以试试这个awk

awk -F'[' '{sub(/^\/\/\s*dbname\./,"",$0); f=$1; $1=FS; print $0 > f }' file 
相关问题