使用带有两个变量的 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
b
和step
来简化问题。
当然!我有一个包含 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
会消耗更长的输入。)
<(command)
表单称为进程替换。
【讨论】:
以上是关于使用带有两个变量的 for 循环的主要内容,如果未能解决你的问题,请参考以下文章