我正在尝试将我的json对象拆分为多个json数组。
{
"MusicCollection": [
{
"PutRequest": {
"Item": {
"Artist": {"S": "No One You Know"},
"SongTitle": {"S": "Call Me Today"},
"AlbumTitle": {"S": "Somewhat Famous"}
}
}
},
{
"PutRequest": {
"Item": {
"Artist": {"S": "Acme Band"},
"SongTitle": {"S": "Happy Day"},
"AlbumTitle": {"S": "Songs About Life"}
}
}
},
{
"PutRequest": {
"Item": {
"Artist": {"S": "No One You Know"},
"SongTitle": {"S": "Scared of My Shadow"},
"AlbumTitle": {"S": "Blue Sky Blues"}
}
}
}
]
}
以下命令在linux中用于将文件拆分为多个putRequest数组。
jq -cM --argjson sublen '2' 'range(0; length; $sublen) as $i | .[$i:$i+$sublen]' \
input.json | split -l 1 -da 3 - meta2_
参考: Split a JSON array into multiple files using command line tools
在命令提示符下直接运行命令下面给出了3个put请求。
jq ".MusicCollection[]" music.json
但是,当我在批处理脚本中使用以下for循环时,它只给我}
。
for /f "tokens=*" %%a in ('music.json') do (
jq ".MusicCollection[]" music.json
set array_value=%%a
)
echo Array: %array_value%
有人可以指导我如何使用for循环获得相同的命令提示输出吗?
答案 0 :(得分:0)
由于你的环境中有jq,假设你也可以毫不费力地使用awk似乎是合理的。如果是这样,您可以沿着以下行将jq的jSONLines输出(使用-c选项调用)传递给awk命令:
awk -v mx=2 'BEGIN{n=0}
n%mx == 0 {
nf++; close(out);
out="OUTPUT."nf".json";
}
{n++; print > out}'
答案 1 :(得分:0)
这个允许你将putRequest拆分为不超过2个项目的数组
jq -c "[ .MusicCollection[] ] | range(0; length; 2) as $i | { MusicCollection: .[ $i:$i+2 ] }" input.json
我想这可以帮助您理解以下脚本。它假定生成的每个文件的名称与模式FileN
匹配(其中N
是数字)。
@echo off
rem stop variable expansion while using them under loop
setlocal enabledelayedexpansion
rem initialize the counters
set /a "FILENUM=0"
set /a "ARRAYLENGTH=2"
for /f "tokens=*" %%a in ( '
jq -c --argjson L "!ARRAYLENGTH!" "[ .MusicCollection[] ] | range(0; length; $L) as $i | { MusicCollection: .[ $i:$i+$L ] }" input.json
' ) do (
rem set the counter to the next file
set /a "FILENUM+=1"
rem print results
echo:File !FILENUM!:
echo:%%~a
echo:
rem uncomment to turn on printing to files called FileN
rem echo:%%~a>File!FILENUM!
)