PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeichen löschen! sed? awk? perl?



athos
07-02-2007, 11:57
Hallo zusammen,
da ich Anfänger in Sachen script bin, brauche ich eure Hilfe.
Ich habe ein file mit ca. 300 bis 500 Zeilen. Jede Zeile hat 269 Zeichen.
Nun möchte ich das in jeder Zeile die Zeichen von 100 bis 120, von 135 bis 180 und von 208 bis 250 gelöscht werden.
Ich habe mit sed experimentiert, aber keine richtige Lösung gefunden (Anfänger:confused: ).
Ich wäre euch echt dankbar wenn Ihr mir bei dem Problem helfen könntet.

Danke und Gruß
Athos

qeldroma
07-02-2007, 12:12
Probiers mit "cut"!

nutze es so, das es jedes Zeichen als Spalte interpretiert. Dann kannst du bei "--fields" die gewünschten Spalten definieren.

Grüße, Florian

EDIT: Geht ja gar nicht, cut braucht ja auch ein bestimmtes Zeichen zum trennen :(

Moment, ich grüble...

athos
07-02-2007, 12:16
Hallo qeldroma,
ich könnte ja die zu löschenden Zeichen mit eine ; eingrenzen. Hilft das vieleicht?

Gruß
Athos

qeldroma
07-02-2007, 12:22
Ok, so würde ich es machen:

# cat deineDatei|sed -e "s/\(.\{100,120\}\).*\(.\{135,180\}\).*\(.\{208,250\} \)/\1\2\3/"

Dies ist die komplizierte Variante, wo mit den tatsächlichen Stellen gearbeitet wird.

Variante zwei sit die grundsätzlich einfachste:
Du hast irgendwelche Trennerzeichen, anhand derer die Spalten definiert sind. Dann solltest du "cut" nehmen, das ist dann simpel.

Poste doch mal drei/vier Zeilen des Files und was du dann als Ergebnis davon sehen möchtest?

qeldroma
07-02-2007, 12:31
Ok, die sed Variante wird nicht klappen ;)

Spannend, spannend.......

Kannst du mit "cut" weitermachen?

qeldroma
07-02-2007, 12:37
So müßte es "sedden":


# cat deineDatei|sed -e "s/.\{99\}\(.\{20\}\).\{34\}\(.\{45\}\).\{27\}\(.\{42 \}\).*/\1\2\3/"

Es lässt nun die Zeichen 1-99 weg, nimmt die folgenden 20, lässt die folgenden 34 weg... usw.
Zum Schluß fügt er nur die rund eingeklammerten wieder ein.

Kann sein, daß du noch plusminus ein Zeichen jeweils schieben mußt, aber ansonsten sollte das nun laufen...

Grüße, Florian

athos
07-02-2007, 12:48
Ich habe Dein script getestet, leider ohne erfolg.
Hier eine Zeile. Die sind immer gleich.
xxxxxxxxxxxxxxx200611300718190 xxxxxxxxxx xxxxxxxxxxx xxxxxxxxxxx 0000000000.0220000000000000000.0000000000000000000 .000000000000000000000000000000000880000xxxxxxxxx 000000

Gruß
Athos

qeldroma
07-02-2007, 12:53
Na da hast du doch Leerzeichen? Kann man die als Trennzeichen sehen? Wie soll denn dann das Ergebnis nun ausschauen?

athos
07-02-2007, 13:05
Eigentlich ist es so gedacht.
Mit sed 's/\(.\{15\}\)/\1;/' usw. die ; einfügen damit man ein Trenzeichen für die db hat. Nur die vielen 0000 stören. Ich kann aber nicht einfach alle weg machen da ich ja noch ein paar brauche ;-)
Das Ergebnis sollte so aussehen.
xxxxxxxxxxxxxxx; 20061130;071819; 0; xxxxxxxxxx; xxxxxxxxxxx; xxxxxxxxxxx; 022880; xxxxxxxxx 000000

Gruß
Athos

qeldroma
07-02-2007, 13:12
ok.


cat Datei|sed -e "s/ /;/g"|cut -d";" -f2-4,8,10


Er macht jedes Leerzeichen zu einem Semicolon, gibt dann die Spalten 2-4,8 und 10 aus.

athos
07-02-2007, 13:17
Aha, das bedeutet also immer zwischen zwei Semicolon (;000; ) ist eine Spalte?

athos
07-02-2007, 13:36
ich bekomme nur ;;;; zusehen. Wenn er aus jedem Leerzeichen ein Semicolon macht bleiben aber immer noch ein haufen Zeichen übrig.

qeldroma
07-02-2007, 14:04
Schau dir mal das Ergebnis vor der Pipe an. Ist das, wie erwartet?
was ergibt also cat Datei|sed -e "s/ /;/g" ?

athos
07-02-2007, 14:21
Nee, leider nicht. Da werden nur die Leerfelder mit ; gefüllt.
Ich habe nun folgendes getan.
Alle Zeichen die ich brauche sind nun mit ; eingeschlossen uns alle Zeichen die ich nicht brauche fangen mit A an und mit B auf. Nun müüsste man eine möglichkeit finden um alles von A bis B zu löschen. Zwischen A und B sind nur Nullen oder Leerfelder.

athos
08-02-2007, 06:44
OK, denke ich habe die Lösung.
Da viele files in einem Verzeichnis liegen habe ich folgendes gemacht.

cat script # hier werden die files nacheinander aufgerufen
for i in $(ls -1 U*); do sed -f cdr_fin ${i%/*} > ${i%/*}.fin; done

cat cdr_fin # hier werden die Zeichen eingefügt
s/\(.\{15\}\)/\1;/
......
s/\(.\{132\}\)/\1A/
..........

und mit
sed -r 's/\A.{40}//'
werden die Zahlen die ich nicht brauche gelöscht.

Ist vielleicht nicht der Hit aber für den Anfang nicht schlecht :)
Für Verbesserungsvorschläge bin ich immer zu haben

Blackhawk
08-02-2007, 08:48
cut -c arbeitet auf charakter-ebene, braucht keine Feldtrennzeichen...