• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Hilfe für awk/regex gesucht.

heb

Newbie
Hallo zusammen,
ich hoffe das mir hier jemand helfen kann!

Ich suche nach einer awk-Funktion oder einem regulärem Ausdruck mit dem ich einmal alle geraden und einmal alle ungeraden Felder einer Datei ansprechen kann.
Ich muss die unterschiedlichen Felder mit verschiedenen Werten multiplizieren.
Wobei die Multiplikatoren, hier als Beispiel 3 und 1, variable Werte sind.
Im Moment sieht das noch so aus:
Code:
awk'{summe=($1*3)+($2*1)+($3*3)+($4*1)+($5*3)+($6*1)+($7*3)+($8*1)+($9*3).........+($16*1)}'
Da gehe ich von einer maximalen Feld Anzahl von 16 aus.
Es können aber durchaus weniger Felder sein.
Eventuell auch mal mehr, dann müsste ich das Script erweitern.
Nun möchte ich das in einer Schleife abfangen.
nach dem Muster:
Code:
{for (i=1; i<=NF; i++) summe1 +=/alle ungeraden/i*3}
{for (i=1; i<=NF; i++) summe2 +=/alle gerade/i*1}
{summe=summe1+summe2}
Wer kann mir mit einer Funktion/regex helfen die diesen gerade/ungerade Kram erschlagen?
Ich sollte noch erwähnen das mein englisch sehr schlecht ist, vielleicht steht es ja ind der Manpage von awk und ich habe es nur übersehen.
Dann würde mir ein Hinweis an die Stelle,zur gezielten Übersetzung mit Wörterbuch, auch helfen.
MfG
heb
 

oc2pus

Ultimate Guru
deutsche Erklärung zu awk/sed
http://www.fernuni-hagen.de/urz/leseecke/B006.html

Beispiele zu sed/awk:
http://home.t-online.de/home/Ralph_Hahn/linux/allgemein/streameditor.htm

damit solltest du mit deinem Problem weiterkommen ;)
 
OP
H

heb

Newbie
Danke oc2pus!!!

Jetzt funzt es. Ist doch wirklich von Vorteil wenn man es lesen und auch verstehen kann was so geschrieben.

So sieht das nun aus:
Code:
{for (i=1; i<=NF; i++) if(i%2 != 0) s1 +=$i*3}
               {for (i=1; i<=NF; i++) if(i%2 == 0) s2 +=$i*1}
               {s=s1+s2}
So ähnlich hatte ich die if-Abfrage schon mal drin, aber auch nur so ähnlich und deshalb hat es vorher nicht funktioniert.
 

oc2pus

Ultimate Guru
heb schrieb:
Jetzt funzt es. Ist doch wirklich von Vorteil wenn man es lesen und auch verstehen kann was so geschrieben.

fein, und du hast es dir selber erarbeitet ;)

Diese beiden Links waren im Konsolen-Forum, in diesem Thread:
Nützliche Links: http://www.linux-club.de/viewtopic.php?t=12706
"versteckt".
Dieser Thread enthält noch mehr solcher Tips und Dokumentationsquellen ... sollte also immer mal als erster Anlaufpunkt bei der Suche gewählt werden!
 
OP
H

heb

Newbie
Hi oc2pus!

Code:
fein, und du hast es dir selber erarbeitet
Das ist mir persöhnlich sogar lieber als eine fertige Lösung, denn so verstehe ich es besser.

Die oben angenagelten Themen hatte ich schon durchforstet.
So auch das angegebene Thema "nützliche Links" und da auch Deinen zweiten Link mit den Beispielen gelesen.
Allerdings habe ich den wohl entscheidenen Link zu dem pdf-file in meiner "Aufregung" übersehen, denn ich bin nicht der geduldigste Mensch und hing an diesem Prob schon ne ganze Weile fest.
Dabei hab ich auch einige Stunden mit googeln verbracht und eigentlich immer nur die gleichen Hinweise gefunden.

Also danke nochmal, hilft manchmal doch mit der Nase direkt auf etwas gestossen werden.

heb
 
OP
H

heb

Newbie
Guten Abend,
jetzt habe ich doch noch ein kleines Problem.

Bevor ich die oben beschriebenen Berechnungen durchführen kann, muss ich eine Zahl in einzelne Ziffern zerlegen.
Das mache ich so:
Code:
ZIFF=`echo $ZAHL|awk ' { s=split ($0,BLA,"");for (i=s; i>0; i--) printf BLA[i]" " } ' `
Das funktioniert unter Linux auch perfekt.
Nun soll aber das Script auch unter verschiedenen Unixen laufen.
Ich habe es unter Solaris und Sinix getestet und da klappt es nicht.
Die split-Funktion zerlegt mir die Zahl nicht da awk die "" als Trennmuster nicht akzeptiert.
Ein zerlegen mit sed habe ich auch probiert, leider klappt das nur bis zu neunstelligen Zahlen.
Habe es so gemacht:
Code:
ZIFF=` echo $ZAHL|sed 's/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\1 \2 \3 \4 \5 \6/'  `
Gibt es noch eine Möglichkeit unter der Konsole Strings in einzelne Bestandteile zu zerlegen.
Ich habe schon danach gesucht bevor ich die split-Funktion in awk "entdeckte" aber nichts gefunden.
Wäre wirklich nett wenn jemand noch ein kleines Prog nennen könnte.
MfG
heb
 
Oben