2017-06-13 6 views
0

Ich habe eine Datei mit zwei Spalten und möchte eine for-Schleife in bash, die den Wert aus der ersten Spalte, subtrahiert 3 und multipliziert es durch den entsprechenden Wert in der zweiten Spalte. Und dann fügen Sie alle Werte zusammen.For Schleife durch eine Datei - mehrere Bedingungen

Die Datei sieht zum Beispiel wie folgt aus:

1 3 
2 5 
7 8 
4 30 

dann will ich eine Schleife, die funktioniert:

for (p in $(awk '{ print $1; }' file.txt) 

do 

    total=$(echo $total+($p-3) | bc) 
    ((count++)) 
done 

    echo " $total" | bc > file2.txt 
:

1-3 * 3 
+ 2-3*5 
+ 7-3*8 
+ 4-3*30 

Ich habe bereits eine for-Schleife, die wie folgt aussieht

Das funktioniert. Aber was kann ich tun, um eine Multiplikation mit einer anderen Spalte der Datei zu machen?

Die folgende Idee nicht funktioniert:

for (p in $(awk '{ print $1; }' file.txt) && k in $(awk '{ print $2; }'  file.txt)). 
+0

'awk‚{total + = ($ von 1 bis 3) * $ 2} END {print total} 'file.txt' – Phylogenesis

+0

Wenn Sie keine Klammern verwenden, stimmt die Erklärung nicht mit der Berechnung überein ... '(1-3) * 3! = 1-3 * 3' – karakfa

+0

Ja natürlich;) – Dontwastetime

Antwort

1
awk '{ sum += $2*($1-3); } END{ print sum; }' <input file> 
+0

Danke !! Aber was kann ich für kompliziertere Iterationen wie Integrale tun? Wenn ich xi + 1 -xi * yi multiplizieren möchte. – Dontwastetime

+0

Ich meine, dass ich mehr auf der Säule arbeiten muss. Könnte ich etwas tun, das meine Version der Foor-Schleife behält, aber eine andere Bedingung enthält? – Dontwastetime

+0

Sicher, fügen Sie einfach einen anderen Befehl zum awk-Skript hinzu. Ihre Version der Schleife ist wirklich kein guter Weg zu gehen. Diese Art von Problemen sind das, was awk handhaben soll. https://edm00se.io/assets/images/post_images/right-tool-for-job-jekyll/scottySays.jpg – Jack

0

Sie haben absolut gültige awkanswer gegeben worden. Aber wenn Sie es vorziehen bash zu verwenden, solange man nur in ganzen Zahlen arbeiten, können Sie alles in bash, ohne die Notwendigkeit tun, um zu laichen awk oder bc:

#!/bin/bash 
sum=0 
while read a b; do 
    ((sum=sum+(a-3)*b)) 
done < file.txt 
echo $sum 
+0

sollte '(a-3) * b' – karakfa

+0

@karakfa Right. Ich habe Beispiel statt Beschreibung betrachtet. Fest. – ArturFH

Verwandte Themen