Bash For循环迭代一次多于1 ?



我有一个列表/数组的每行引号字符串在列表中。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"]等。

我有两个问题需要解决。

  1. 我不知道如何在for循环中做到这一点…看看一堆for循环的例子来为序列&增量这是显而易见的,但我真的不知道你应该做什么,你想要它批处理多行每循环,例如像20行的范围在一个时间?对我来说似乎很简单,但我以前没有做过。

  2. 可能处理参数数组中逗号分隔的情况。如。每次拆分元素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将看到逗号和双引号。

最新更新