我需要將很多JSON 檔案合并成一個 .json
我已經試過了,jq但它不會是我需要的格式。也許jq我錯過了一個選項。
所有 JSONS 都具有以下結構。
{"skuReference":"1","quantity":"0","backlog":"0"}
輸出應該是:
{"skuReference":"1","quantity":"0","backlog":"0"},
{"skuReference":"2","quantity":"0","backlog":"0"},
{"skuReference":"3","quantity":"0","backlog":"0"},
...
在每個“單個 json”之后都應該有一個逗號來分隔。
uj5u.com熱心網友回復:
使用 sed:
$ sed '$!s/$/,/' files* # > out_file
它將行尾 ( s/$/) 替換為逗號,但最后一行 ( $!) 除外。所以,如果我得到:
$ cat foo
{"skuReference":"1","quantity":"0","backlog":"0"}
$ cat bar
{"skuReference":"2","quantity":"0","backlog":"0"}
和我:
$ sed '$!s/$/,/' foo bar
{"skuReference":"1","quantity":"0","backlog":"0"},
{"skuReference":"2","quantity":"0","backlog":"0"}
uj5u.com熱心網友回復:
這個怎么樣?
jq -s '[.[]]' *.json | tail -n 2 | head -n -1 | output.json
頭部和尾部是洗掉前導和尾隨括號,因為 jq 將合并為陣列型別
uj5u.com熱心網友回復:
為大量檔案調整@JamesBrown POSIXsed 解決方案。
例子:
- 讓我們創建大量的 JSON,每一個都包含
{}在一行中:
mkdir JSONs
for ((i=0; i<2097152; i ))
do
echo '{}' > JSONs/$i.json
done
- 讓我們看看您是否可以將它們用作命令的引數:
ls JSONs/*.json
# bash: /usr/bin/ls: Argument list too long
哎呀,檔案太多了!我們將需要find用于處理如此龐大的數量。
- 讓我們試試
find -exec cat | sed:
find JSONs -type f -name '*.json' -exec cat {} | sed '$!s/$/,/' > JSONs.txt
wc -l JSONs.txt
# 2097152 JSONs.txt
grep -v '^{},$' JSONs.txt | wc -l
# 1
tail -n 1 JSONs.txt
# {}
由此,我們可以得出結論,這個解決方案是有效的:只有一行JSONs.txt沒有添加逗號,那就是最后一行。
- 現在讓我們嘗試
find | xargs sed:
find JSONs -type f -name '*.json' | xargs sed '$!s/$/,/' > JSONs.txt
wc -l JSONs.txt
# 2097152 JSONs.txt
grep -v '^{},$' JSONs.txt | wc -l
# 296
哎呀,我們到了296而不是1這里。原因是xargs已經運行了多個sed命令,每個命令都具有允許的最大引數數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/363391.html
