2014-05-05 15 views
5

Ich habe eine Frage über for-Schleife in Bash Ich möchte awk Befehl für einen bestimmten Bereich um 34 erhöhen, aber ich weiß nicht, wie zwei Variablen in einer for-Schleife angeben. Ich weiß, wie man es für eine Variable macht, aber es funktioniert nicht für zwei. dies ist mein Code für eine Variable:Verwenden Sie für Schleife mit zwei Variable

#!/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 

aber ich möchte beide Variablen angeben ($ a, $ b), so etwas wie dieses, das funktioniert nicht! : Wenn Sie eine Schleife über zwei Variablen

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 

Danke,

+0

also was wollten Sie nur die awk Codes mit a, b erweitert drucken? Oder möchten Sie, dass die awk-Codes ausgeführt werden? – Kent

+0

Mein letztes Ziel ist es, den awk Code für den Bereich zwischen 1 bis 3400 mit dem Bereich auszuführen, für den ich keine Lösung finden konnte. Also habe ich versucht, es auszudrucken und die Ausgabe mit && in der Mitte jedes awk auszuführen! Aber meine erste Frage betrifft das Hinzufügen von zwei Variablen in einer for-Schleife. Ich bin nicht sicher, ob ich eine andere Frage öffnen sollte oder nicht? – user3576287

+0

Können Sie ein Beispiel geben, um zu erklären, was Sie wollen? Sehr wahrscheinlich warst du auf einem falschen Weg. Sie könnten kleinere 'a'' b' und 'step' verwenden, um die Frage zu vereinfachen. – Kent

Antwort

0

(1) benötigen, dann würden Sie wahrscheinlich wollen sicherstellen, dass diejenigen, die die gleiche Menge von Daten enthalten. echo {1..3400..34} würde einen Wert mehr als echo {35..3400..34} erzeugen. Unter der Annahme,

(2), dass die beiden Eingänge von der gleichen Größe sind, können Sie eine while Schleife verwenden:

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)) 

(Sie könnten die Schleife mit den beiden Eingängen von ungleicher Größe verwenden, aber das ist wahrscheinlich, was Sie nicht wollen.Im obigen Beispiel würde die Variable a die längere Eingabe verbrauchen.)

Das Formular <(command) wird als Prozesssubstitution bezeichnet.

+0

Danke Mann! @devnull – user3576287

5

Verwendung von C-style for-Schleife:

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

(wird die gleiche Ausgabe wie devnull Antwort haben, aber in der reinen Bash).

Natürlich in diesem einfachen Fall ist es genug, nur tun:

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

Ich bin sicher, Sie werden in der Lage sein, herauszufinden, wie dies anzupassen, was Sie genau wollen.

Verwandte Themen