2014-05-05 179 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 

我敢肯定,你就可以弄清楚如何將這個適應你到底想要什麼。