2016-07-09 11 views
0

ich mehrere Dateien, diemachen mathematische Operation aus mehreren Dateien mit Shell-Skripten

fname1 sagen lassen enthält:

red=5 
green=10 
yellow=2 

fname2 enthält:

red=10 
green=2 
yellow=2 

fname3 enthält:

red=1 
green=7 
yellow=4 

Ich möchte Skript schreiben, die aus diesen Dateien lesen, die Zahlen für jede Farbe summieren, und die Summen in eine neue Datei umleiten.

Neue Datei enthält:

red=16 
green=19 
yellow=8 
+1

Das klingt wie Hausaufgaben. Was hast du probiert? – xxfelixxx

+2

Verwenden Sie 'awk'. Verwenden Sie die Farbe als Schlüssel eines Arrays und fügen Sie dem Array-Wert die Zahl hinzu. Am Ende drucken Sie alle Array-Elemente. – Barmar

+0

es ist von m in der Arbeit erforderlich, ich arbeite auf Redhat-Server, und ich habe diese drei Dateien enthält diese Variablen, also will ich Bash-Skript schreiben, um mathematische Operation auf die Dateien zu machen und die Summe auf neue Datei umleiten ,,, danke für Ihre Antwort –

Antwort

3

[ awk ] ist dein Freund:

awk 'BEGIN{FS="=";} 
      {color[$1]+=$2} 
    END{ 
     for(var in color) 
      printf "%s=%s\n",var,color[var] 
     }' fname1 fname2 fname3 >result 

sollte es tun.


Demystifying über Sachen

  • Alles, was innerhalb '' ist enthalten ist die awk-Programm.
  • Stuff innerhalb BEGIN wird nur einmal ausgeführt, dh am Anfang
  • FS ist eine awk eingebaute Variable, die für Feldtrennzeichen steht.
  • Einstellung von FS auf = bedeutet, dass awk = verwendet, um die Felder/Spalten zu begrenzen.
  • Standardmäßig betrachtet awk jede Zeile als Datensatz.
  • In diesem Fall haben Sie zwei Felder mit $ 1 und $ 2 in jedem Datensatz mit = als Trennzeichen bezeichnet.
  • {color[$1]+=$2} erstellt (falls nicht bereits vorhanden) ein assoziatives Array mit Farbnamen, da die key und += die value des Feld2 zu diesem Array-Element hinzufügt. Beachten Sie, dass assoziative Arrays zum Zeitpunkt der Erstellung auf Null initialisiert werden.
  • Dies wird für die drei Dateien wiederholt fname1, fname2, fname3 in awk
  • eingegeben
  • Alles in END{} wird nur zuletzt ausgeführt werden, dh kurz vor dem Beenden.
  • for(var in color) ist der Stil von Forloop, der zum Analysieren eines assoziativen Arrays verwendet wird.
  • Hier var wird ein key und color[key] Punkte auf Wert sein.
  • printf "%s=%s\n",var,color[var] ist selbst erklärt.

Hinweis

  • Wenn alle Dateinamen mit fname beginnen Sie sogar fname* statt fname1 fname2 fname3
  • Dies setzt voraus, setzen kann, dass es keine Leerzeilen in jeder Datei
+0

Danke für Ihre Hilfe, aber als ich es versuchte, erhielt ich den täuschenden Fehler awk: cmd. Zeile: 6:} awk: cmd. Zeile: 6:^Syntaxfehler –

+1

@ p.louis: Korrigiert, Als ich den Code formatierte, kam ein zusätzliches '}' nach 'color [var]' herein;) Sorry abt das – sjsam

+0

Gut gemacht! Du hast es wie ein Stück Kuchen aussehen lassen. –

0

Weil Ihre Quelldateien gültiger Shell-Code sind. Sie können sie nur (wenn sie von einer vertrauenswürdigen Quelle stammen) einsortieren und unter Verwendung von Shell Arithmetic akkumulieren.

#!/bin/bash 

sum_red=0 
sum_green=0 
sum_yellow=0 

for file in "[email protected]";do 
    . ${file} 
    let sum_red+=red 
    let sum_green+=green 
    let sum_yellow+=yellow 
done 

echo "red=$sum_red 
green=$sum_green 
yellow=$sum_yellow" 
+0

danke viel, aber wenn ich es versuchte, ist es Druck rot = 0 grün = 0 gelb = 0 nicht die Summe –

+0

Sie müssen Sie Eingabedateien als Argumente liefern: './sum.sh Rahmen *' –

+0

vielen Dank für Sie helfen, ich habe es versucht, aber es scheint falsch Summe, es ist mit @ sjsam Code gelöst –