Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Hilfe für awk/regex gesucht.

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
heb
Newbie
Newbie
Beiträge: 21
Registriert: 29. Nov 2003, 12:30

Hilfe für awk/regex gesucht.

Beitrag von heb »

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: Alles auswählen

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: Alles auswählen

{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
Benutzeravatar
oc2pus
Ultimate Guru
Ultimate Guru
Beiträge: 6506
Registriert: 21. Jun 2004, 13:01

Beitrag von oc2pus »

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 ... editor.htm

damit solltest du mit deinem Problem weiterkommen ;)
tell people what you want to do, and they'll probably help you to do it.
PackMan
LinWiki : Das Wiki für Linux User
heb
Newbie
Newbie
Beiträge: 21
Registriert: 29. Nov 2003, 12:30

Beitrag von heb »

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: Alles auswählen

{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.
Benutzeravatar
oc2pus
Ultimate Guru
Ultimate Guru
Beiträge: 6506
Registriert: 21. Jun 2004, 13:01

Beitrag von oc2pus »

heb hat geschrieben: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!
tell people what you want to do, and they'll probably help you to do it.
PackMan
LinWiki : Das Wiki für Linux User
heb
Newbie
Newbie
Beiträge: 21
Registriert: 29. Nov 2003, 12:30

Beitrag von heb »

Hi oc2pus!

Code: Alles auswählen

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
heb
Newbie
Newbie
Beiträge: 21
Registriert: 29. Nov 2003, 12:30

Beitrag von heb »

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: Alles auswählen

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: Alles auswählen

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
Antworten