我有一个列表/数组的每行引号字符串在列表中。json文件。该文件是动态生成的,大小从1到0不等。目前有127个元素。我需要处理每一行,不管是1还是inf。
[
"p1",
"p2",
...,
"p127"
]
这些参数需要添加到数组中的命令标志上,例如。command --params=["p1","p2","...","p20"]
每个命令最多可以占用20个。
目前,我正在为列表中的每个参数生成一个命令。Json,使用简单的for循环。如低于
lines="$(cat list.json)"
for l in ${lines} ;
do
command --params=[${l}]
done
。当前生成并运行127个循环:command --params=["p1"]
command --params=["p2"]
…command --params=["p127"]
等,保存输出。
这是最基本的,非常低效的&慢的方法。理想情况下,我想减少我的命令总数,所以它使用最大参数。每个循环20;1st loop = command --params=["p1","p2",..."p20"]
2nd loop = command --params=["p21","p22",..."p40"]
等。
我有两个问题需要解决。
我不知道如何在for循环中做到这一点…看看一堆for循环的例子来为序列&增量这是显而易见的,但我真的不知道你应该做什么,你想要它批处理多行每循环,例如像20行的范围在一个时间?对我来说似乎很简单,但我以前没有做过。
可能处理参数数组中逗号分隔的情况。如。每次拆分元素20个,进入他们自己的没有变形的json数组。不带逗号等
首先用逗号连接20个元素,然后以这些元素作为参数运行命令。
xargs -n20 sh -c 'IFS=,; echo "$*"' - < lines.json |
xargs -I{} command --params=[{}]
我猜--params=
预计是一个JSON数组。我建议只是使用jq
循环并将其拆分为20个元素的数组。如何分割成块的jq数组?
jq -c '_nwise(20)' lines.json |
xargs -d 'n' -I{} command --params={}
以下是xargs
的想法/演示:
$ seq 43 > testdata
$ n=5
$ xargs -L $n xargs bash -c '
[ $# = '$n' ] || exit
echo args = "$@"
' -- <testdata
args = 1 2 3 4 5
args = 6 7 8 9 10
args = 11 12 13 14 15
args = 16 17 18 19 20
args = 21 22 23 24 25
args = 26 27 28 29 30
args = 31 32 33 34 35
args = 36 37 38 39 40
- 注意
'$n'
实际上是不引用变量 --
是一个注释(参见bash-c
文档)- 用更有趣的东西替换
echo
您想要如何使用这些行并不清楚,xargs
几乎肯定是您想要使用的,但您可以用以下方式阅读几行:
#!/bin/sh
line_count=5
while for ((i=0; i < $line_count; i++)); do
eval read line$i || break;
done;
test $i = $line_count
do
for ((i=0; i < $line_count; i++)); do
eval "echo line $i = $line$i"
done
done
mapfile -t params < <(jq '.[]' params.json)
IFS=,
for ((i=0; i < ${#params[@]}; i+=20)); do
echo command --params="[${params[*]: i:20}]"
done
运行此命令,并验证生成的命令看起来正常,然后删除echo
以运行真实的.
For fileparams.json
:
[
"1",
"2",
"3",
...
"24",
"25"
]
生成的命令如下:
command --params=["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"]
command --params=["21","22","23","24","25"]
删除echo,这些命令将被执行。command
将看到逗号和双引号。