2016-05-17 107 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 
相關問題