2014-05-05 135 views
5

我有一个关于在Bash循环的问题 我想运行特定范围增加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 

感谢,

+0

所以你想要的只是打印awk代码a,b扩展?或者你想要awk代码执行? – Kent

+0

我的最终目标是执行范围在1-3400之间的awk代码,该范围我找不到任何解决方案。所以我试图打印出来,并通过在每个awk中使用&&来运行输出!但我的第一个问题是关于在for循环中添加两个变量。我不确定我是否应该打开另一个问题? – user3576287

+0

你能举一个例子来解释你想要的吗?很可能你错了。你可以使用较小的'a'' b'和'step'来简化问题。 – Kent

回答

0

(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)表格被称为进程替换。

+0

谢谢你! @devnull – user3576287

5

使用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 

我敢肯定,你就可以弄清楚如何将这个适应你到底想要什么。