2016-04-11 9 views
0

Beispieldatei:Bash Mathe - Dividing eine Reihe von Zeilen für Anweisung

25  Firstname1 Lastname1  domain1.com planname @1.00 USD  Monthly Active 04/24/2016  Edit 
    1068 Firstname2 Lastname2  domain2.com planname @7.95 USD  Annually Active 05/09/2016  Edit 
    3888 Firstname3 Lastname3  domain3.com planname @19.95 USD  Biennially Active 05/04/2016  Edit 

ich nur den Preis und Abrechnungszyklus am Extrahieren und bin die Abrechnungszeiträume in numerischen Wert Umwandlung auf diese Weise ich den Preis teilen kann der Abrechnungszyklus, um Kosten pro Monat zu erhalten.

Wenn Sie die for-Anweisung verwenden, fügt das Hinzufügen von Zeilenumbrüchen die mathematische Berechnung ein.

Code:

for i in `cat asd | cut -d "@" -f 2 | awk '{print $1, $3}' | sed 's/Monthly/\/ 1/g' | sed 's/Annually/\/ 12/g' | sed 's/Biennially/\/ 24/g' |grep -Ev 0.00` ; do echo $i | bc -l' ; done 

Ich würde es vorziehen können 1 erhalten Antwort alle Zeilen dann zusammen aufgeteilt erhalten Sinn hinzugefügt eine endgültige Antwort zu erhalten.

Antwort

0

Man könnte so etwas tun: (Wenn Sie auf einer einzigen Zeile vollständig eingestellt sind)

cat asd | cut -d "@" -f 2 | awk '{print $1, $3}' | sed 's/Monthly/\/ 1/g' | sed 's/Annually/\/ 12/g' | sed 's/Biennially/\/ 24/g' | grep -Ev 0.00 | while IFS= read -r line; do echo "$line" | bc -l; done | tr '\n' '+' | sed 's/+$/\n/' | bc -l 

Aber das wäre viel mehr klar:

tmp=$(mktemp) 
cat asd | cut -d "@" -f 2 | awk '{print $1, $3}' | sed 's/Monthly/\/ 1/g' | sed 's/Annually/\/ 12/g' | sed 's/Biennially/\/ 24/g' | grep -Ev 0.00 > $tmp 

tmp2=$(mktemp) 
cat $tmp | while IFS= read -r line; do 
    echo "$line" | bc -l >> $tmp2 
done 

# Actual output 
cat $tmp2 | tr '\n' '+' | sed 's/+$/\n/' | bc -l 
rm $tmp $tmp2 
+0

Mehrere Beispiele für nutzlosen Gebrauch von 'Katze'. Bei 'mktemp' kann es zu Portabilitätsproblemen kommen. Siehe http://stackoverflow.com/questions/2792675/how-portable-is-mktemp1 – cdarke

1

Alle diese Anrufe zu cat, , awk, sed, grep und bc - was für eine Verschwendung.

Dies ist ein falsch benannter Post, da Sie Bash nicht für Berechnungen verwenden. Der Grund ist, dass bash im Gegensatz zu Korn Shell (ksh) Gleitkomma nicht unterstützt. Sie greifen also auf Utilities wie bc zurück. Warte, aber awk unterstützt Gleitkomma auch.

awk ist eine eigene Programmiersprache. Dies verwendet nur eine Instanz von awk. Ich habe es in einem Bash-Skript eingebettet, weil Sie wahrscheinlich andere Sachen zu tun, sondern mit einer kleinen Anpassung könnte es sein, steht alone-mit #!/bin/awk an der Spitze:

infile='asd' 

# -f - means "read the program from stdin" 
# << '_END_' is a here document. Redirect stdin from here to the label _END_ 
awk -f - "$infile" << '_END_' 
BEGIN { 
# an associative array for the billing cycles 
cycles["Monthly"] = 1 
cycles["Annually"] = 12 
cycles["Biennially"] = 24 
} 

{ 
sub(/@/,"",$6)   # Remove the @ from the amount 
total += $6/cycles[$8] # divide amount by the billing cycle, add to total 
} 
END { print total } 
_END_ 

Sie nicht denken, dies ist einfacher zu verstehen und pflegen? Es ist auch effizienter. Dieses awk-Skript ist wahrscheinlich eine gute Übung für einen Trainingskurs awk 101.