ubuntuusers.de

sed und awk

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Bassti-er

Anmeldungsdatum:
27. Oktober 2010

Beiträge: Zähle...

Hallo Leute ich grübel jetzt schon geraume Zeit und die habe ich eigentlich gerade nicht, weswegen ich eure Hilfe ersuche. Ich habe einen ganz Ordner mit Messreihen als als.txt vorliegen, indem die einzelnen Messungen wie folgt aussehen:

Messung = 00-50-13dot95-1.dat

Dateipfad = ...\...\

Kameraaufloesung [um] = 0.2

Sq [A] = 7

Sa [A] = 5

Messung = 00-50-13dot95-2.dat

Dateipfad = ...\...\

Kameraaufloesung [um] = 0.2

Sq [A] = 2

Sa [A] = 5

Messung = 00-50-3dot95-1.dat

Dateipfad = ...\...\

Kameraaufloesung [um] = 0.2

Sq [A] = 6

Sa [A] = 4

...

Mein Problem ist, das in dem Dateinamen der einzelnen Messungen Informationen über die Messungen drin stehen, die ich extrahieren und an jeden Block hinten anstellen möchte, bspw so:

Messung = 00-50-3dot95-1.dat

Dateipfad = ...\...\

Kameraaufloesung [um] = 0.2

Sq [A] = 6

Sa [A] = 4

WW = 00

XX = 50

YY = 3dot95

ZZ = 1

...

Mir ist zwar bewusst, dass dies mit sed und awk funktioniert, aber durch den Synthax blick ich leider null durch, da ich mich bisher nur mit etwas C beschäftigt habe. Für einige Tipps wäre ich sehr dankbar und meine Masterarbeit auch 😀

Grüße, Bassti

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Bei Deiner blöden Schreibweise als "Zitat" kann man ja gar nicht sehen, wie de Daten tatsächlich vorliegen !
(ich nehme an, die Leerzeilen zwischendurch gibt es gar nicht, und die Leerzeichen dazwischen womöglich auch nicht ...?)

Du solltest also die tatsächlichen Daten mal "in Originalform" in einem Codeblock posten, damit wir überhaupt was reelles zum testen haben.

Mit sed wirst Du hier nicht viel reißen, das wird eher was für awk - und dazu gibt es ein schönes Tutorial.

Formulier bitte auch mal "in Prosa" wie die "Messung"- Zeile zerlegt und umgeformt werden soll, und wonach diese Daten dann ausgegeben werden sollen. (was ist der Trigger ? - sollen die Zusatzdaten immer nach der "Sa [A]"- Zeile ausgegeben werden ?)

track

Bassti-er

(Themenstarter)

Anmeldungsdatum:
27. Oktober 2010

Beiträge: 27

Dann versuche ich es nochmal in korrigierter Form:

Messung =	00-50-13dot95-1.dat
Dateipfad =	...\...\
Kameraaufloesung [um] =	0.2
Sq [A] =	7
Sa [A] =	5


Messung =	00-50-13dot95-2.dat
Dateipfad =	...\...\
Kameraaufloesung [um] =	0.2
Sq [A] =	21
Sa [A] =	5


Messung =	00-50-3dot95-1.dat
Dateipfad =	...\...\
Kameraaufloesung [um] =	0.219295
Sq [A] =	6
Sa [A] =	4

Das ganze txt-File ist also so gehalten, das man es als Tabelle laden und auf die einzelnen Messwerte zugreifen zu kann

Nun soll aus den einzelnen Blöcken die erste Zeile: Messung = 00-50-13dot95-1.dat genommen werden und die einzelnen Teile zwischen dem Trenner - in einer Zeile unter Sa [A] = 5 angehangen werden und zwar für jeden Block. Also am Beispiel des ersten Blocks sieht sollte das wie folgt aussehen:

Messung =	00-50-13dot95-1.dat
Dateipfad =	...\...\
Kameraaufloesung [um] =	0.2
Sq [A] =	7
Sa [A] =	5
Zyklus =/t 00
Vergrößerung = /t 50
Winkel = /t13dot95
Index= /t 1
/n

Dann käme der zweite Block hinten dran. Zwischen den Werten und dem Gleicheitszeichen ist ein Tabulator zur Trennung. Sonst noch was, was ich erwähnen sollte?

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi, Frohe Weihnachten!

Das könnte so aussehen:

#! /usr/bin/awk  -f

BEGIN   { FS="-"; }

/^Messung/  {
  cyc=$1;
  mag=$2;
  ang=$3;
  ind=$4;
}

/^Messung/,/^Sa/  { print $0; }

/^Sa/  {
  print "Zyklus=\t" cyc;
  print "Vergrößerung=\t" mag;
  print "Winkel=\t" ang;
  print "Index=\t" ind;
  print "";
}

Also eine Datei erstellen die in der ERSTEN Zeile mit #! ...

beginnt und diese muss ausführbar sein (auf konsole chmod a+x meinscript).

dann einfach aufrufen:

./meinscript meinemesswerte.txt

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Vielleicht kann man es noch etwas übersichtlicher strukturieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#! /usr/bin/awk  -f

BEGIN	{  FS="[-.\t]"  }		# alle 3 Trennzeichen als Regex eintragen

	{  print $0     }		# Originalzeile drucken

/^Messung/	{  messung= $0  }	# Die Messungs-Zeile zwischenspeichern

/^Sa/	{  $0= messung;			# die Zusatz-Zeilen drucken:
	   print "Zyklus=\t" $2;
	   print "Vergrößerung=\t" $3;
	   print "Winkel=\t" $4;
	   print "Index=\t" $5	}

LG,

track

Bassti-er

(Themenstarter)

Anmeldungsdatum:
27. Oktober 2010

Beiträge: 27

Vielen vielen Dank Jungs, hat prima funktioniert!

Grüße, Bassti

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Ich konnte da nicht widerstehen und habe das mal in Python (3.3) umgesetzt: Gist

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Lysander schrieb:

Ich konnte da nicht widerstehen und habe das mal in Python (3.3) umgesetzt: Gist

😀 Verstehe ich ja ! - nur, für solch ein simples Ding noch extra 40 Zeilen "Formkram" auf die Bühne zu hieven, das ist mir zu viel Aufwand.
Darum bleibe ich lieber bei solchen "Simpelchen" wie sed / awk / Perl, auch wenn sie nicht so schön sind.

LG,
und einen guten Rutsch,

track

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

@track Hehe... ja klar, ich denke ich könnte es auch in Python auf 10 - 15 Zeilen zusammen quetschen - aber eben auf Kosten der Lesbarkeit und darüber hinaus des Komforts. Mir ging es eigentlich nur darum, ein wenig fit zu bleiben und speziell Dinge wie itertools.groupby nutze ich sonst selten ☺ Und da passte es mal wie A.... auf Eimer 😀

Antworten |