使用带有两个变量的 for 循环

Posted

技术标签:

【中文标题】使用带有两个变量的 for 循环【英文标题】:Use for loop with two variable 【发布时间】:2014-06-21 17:35:38 【问题描述】:

我对 Bash 中的 for 循环有疑问 我想为增加 34 的特定范围运行 awk 命令,但我不知道如何在 for 循环中指定两个变量。 我知道如何为一个变量执行此操作,但它不适用于两个变量。 这是我的一个变量的代码:

#!/bin/bash
for a in 1..3400..34
do
printf "awk 'NR>=$a&&NR<=$b  if (/^[0-9]/) sum++ END print "row\t", sum ' file "
done

但我想指定两个变量 ($a,$b),这样的东西不起作用! :

for a in 1..3400..34 , for b in 35..3400..34
do
printf "awk 'NR>=$a&&NR<=$b  if (/^[0-9]/) sum++ END print "row\t", sum ' hydr_dE.txt && "
done

谢谢,

【问题讨论】:

所以你想要的只是打印带有 a、b 扩展的 awk 代码?或者你想让 awk 代码被执行? 我的最终目标是在 1-3400 之间执行 awk 代码,但我找不到任何解决方案。因此,我尝试在每个 awk 中间使用 && 将其打印出来并运行输出!但我的第一个问题是关于在 for 循环中添加两个变量。我不确定是否应该提出另一个问题? 你能举个例子来解释你想要什么吗?很可能你走错路了。你可以使用更小的a bstep 来简化问题。 当然!我有一个包含 3400 行的文件。我希望我的脚本:首先将行从 1-34 、 35-68 等分成 100 个部分。然后计算包含数字而不是我的 awk if (/^[0-9]/) sum++ 中的数字的行数,并给我一个制表符分隔的分隔行输出(1-100)和计数的数字。对不起我的英语不好! 当我提到“示例”时,它意味着您的输入文件预期的输出......当然,来自您的真实数据的简化版本。 【参考方案1】:

使用 C 风格的 for 循环:

for ((a=1,b=35;a<=3400,b<=3400;a+=34,b+=34)); do
    echo ": $a :: $b :"
done

(将具有与 devnull 的答案相同的输出,但在纯 Bash 中)。

当然,在这种简单的情况下,只需这样做就足够了:

for ((a=1;b=a+34,b<=3400;a+=34)); do
    echo ": $a :: $b :"
done

我相信您将能够弄清楚如何将其调整为您真正想要的。

【讨论】:

【参考方案2】:

(1) 如果您需要遍历两个变量,您可能需要确保它们包含相同数量的 数据。 echo 1..3400..34 会产生比echo 35..3400..34 多一个值。

(2) 假设两个输入的大小相同,您可以使用while 循环:

while read a b; do
  echo ": $a :: $b :";
  # do something with a and b here
done < <(paste <(seq 1 34 3400) <(seq 35 34 3434))

(您也可以将循环与两个大小不等的输入一起使用,但这可能不是您想要的。在上面的示例中,变量a 会消耗更长的输入。)

&lt;(command) 表单称为进程替换。

【讨论】:

以上是关于使用带有两个变量的 for 循环的主要内容,如果未能解决你的问题,请参考以下文章

带有变量组合的SCSS中的for循环[重复]

为啥for循环最少避免使用浮点型变量作为循环变量

两个for循环执行顺序

JS中for循环变量作用域

是否可以在for循环中声明两个不同类型的变量?

如何使用 for 循环对多个变量运行配对 wilcoxon 测试