2017-06-17 2 views
0

I eine Eingangs Editor-Datei haben, wie unten gezeigt:arithmetische Berechnung in Shell-Scripting-schlag

Probeneingabedatei:

Gemüse und Raten

kg rate total 
Tomato 4 50 100 
potato 2 60 120 
Beans 3 80 240 

Overalltotal: (100 + 120 + +240) = 460

Ich muss die Spalte 2 und Spalte 3 multiplizieren und überprüfen Sie die Summe, wenn es richtig ist und die Gesamtmenge insgesamt auch. Wenn das nicht richtig brauchen wir in der gleichen Datei als Fehlermeldung unter

Code eingeben hier

Beispielausgabedatei wie abgebildet drucken:

Gemüse und Preise

kg rate vegtotal 

Tomato 4 50 200 
potato 2 60 120 
Beans 3 80 240 

Overalltotal : (200 + 120 ++ 240) = 560

Fehler in den Berechnungen: V egtotal für Tomaten ist falsch: Es sollte 200 statt 100 Overalltotal sein, ist falsch:

for f in Date*.log; do 
     awk 'NR>1{ a[$1]=$2*$3 }{ print }END{ printf("\n"); 
      for(i in a) 
     { if(a[i]!=$4) 
       { print i,"Error in calculations",a[i] } 
      } }' "$f" > tmpfile && mv tmpfile "$f"; 

done 

es die Gesamt berechnet, aber nicht die Werte zu vergleichen: Es 560 statt 460

-Code so weit sein sollte. Wie kann ich sie vergleichen und in dieselbe Datei drucken?

+1

Bitte ankreuzen Einen Blick auf [editing-help] (http://stackoverflow.com/editing-help). – Cyrus

+0

Es gab eine fast identische Frage, die vor ein paar Tagen gestellt wurde, aber unter Verwendung von Schülerbewertungen. Durchsuchen Sie die Archive. –

Antwort

0

Eingangs

[email protected]:/tmp$ cat file 
kg rate total 
Tomato 4 50 100 
potato 2 60 120 
Beans 3 80 240 

Output

[email protected]:/tmp$ awk 'FNR>1{sum+= $2 * $3 }1;END{print "Total : "sum}' file 
kg rate total 
Tomato 4 50 100 
potato 2 60 120 
Beans 3 80 240 
Total : 560 

Erläuterung

awk '        # call awk 
    FNR>1{       # if no of lines of current file is greater than 1, 
            # then , this is to skip first row 
      sum+= $2 * $3   # sum total which is product of value 
            # in column2 and column3 
    }1;       # 1 at the end does default operation, 
            # that is print current record (print $0) 
            # if you want to skip record being printed remove "1", so that script just prints total 
    END{       # end block 
      print "Total : "sum # print sum 
    } 
    ' file 
1

Complex awk Lösung:

awk 'NF && NR>1 && $0!~/total:/{ 
     r=$2*$3; v=(v!="")? v"+"r : r; 
     if(r!=$4){ veg_er[$1]=r" instead of "$4 } 
     err_t+=$4; t+=r; $4=r 
    } 
    $0~/total/ && err_t { 
     print $1,"("v")",$3,t; print "Error in calculations:"; 
     for(i in veg_er) { print "Veg total for "i" is wrong: it should be "veg_er[i] } 
     print "Overalltotal is wrong: It should be "t" instead of "err_t; next 
    }1' inputfile 

Der Ausgang:

kg rate total 
Tomato 4 50 200 
potato 2 60 120 
Beans 3 80 240 

Overalltotal: (200+120+240) = 560 
Error in calculations: 
Veg total for Tomato is wrong: it should be 200 instead of 100 
Overalltotal is wrong: It should be 560 instead of 460 

Details:

  • NF && NR>1 && $0!~/total:/ - unter Berücksichtigung veg Linien (excuding Kopf und insgesamt Linien)

  • r=$2*$3 - das Ergebnis Produkt der 2. und 3. Felder

  • v=(v!="")? v"+"r : r - Verkettungs resultierende Produkt Werte

  • veg_er - das Array enthält falsche vegs info (veg name, fehlerhafter Produktwert und realer Produktwert)

  • err_t+=$4 - Akkumulieren irrtümlicher Gesamtwert

  • t+=r - Ansammeln realen Gesamtwert

  • $0~/total/ && err_t - Verarbeitung Gesamt Linie und Fehlerereignisse

+0

Danke. Der Fehler schreibt jedoch nicht in die Datei und gibt sie im Terminal selbst aus. Wir können Fehler in eine Datei schreiben, indem wir "} 1 'Eingabedatei> Ausgabedateiname" in der letzten Zeile des oben erwähnten Codes eingeben. Angenommen, es gibt mehrere Eingabedateien und ein Ausgabefehler sollte in jede Datei geschrieben werden. Wie machen wir das? – User88

+0

@Rashmirao, um die anfängliche Datei zu überschreiben, wenden Sie diesen Ansatz aus Ihrer Frage an: 'awk ... Eingabedatei> tmpfile && mv tmpfile Eingabedatei' – RomanPerekhrest

+0

yeah, das habe ich gemacht. Wenn ich das benutze, überschreibt es meine Eingabedateidaten und Benutzer müssen die Eingabedatei wieder öffnen, um zu sehen. Aus diesem Grund versuche ich, die Eingabe beizubehalten und versuche dann unterhalb der Anzeige die Ausgabenachricht anzuzeigen. – User88

Verwandte Themen