Hallo,
ich habe eine Datei, die besteht aus vielen unterschiedlichen Datensätzen. Jeder Datensatz beginnt mit "<>". Allerdings ist der Beginn eines Datensatzes nicht gleichzeitig die Stelle, an der ein LF (Linefeed) steht. Ich muss die LF komplett ignorieren.
Meine Aufgabe: Datensätze suchen, bei denen an Position 9-11 die Zahl 580 steht und dann den Wert (Zahl) zurückgeben der von Position 37 bis 52 reicht.
Auf der Unix-Shell (AIX) kriege ich es weder mit SED, CUT, GREP oder AWK hin. Lässt sixch das mit einem Perl-Einzeiler. Auf dem System an dem ich arbeiten muss sind weder Perldoc installiert noch die Installation zusätzlicher Bibliotheken erlaubt. Perl -v meldet "This is perl, v5.8.7 built for aix"
Edit: typo
renee
2008-02-21 15:37
User since 2003-08-04
14371
Artikel ModeratorIn
Zeige doch mal einen Beispieldatensatz... Wenn Ein Datensatz immer mit "<>" anfängt und das *nicht* im Datensatz selbst vorkommen kann, solltest Du es mit einem neuen Wert für $/ versuchen...
Das kann ich leider nicht. Datenschutz. Es handelt sich um Produktivdaten aus dem eCommerce-Bereich.
murphy
2008-02-21 16:01
User since 2004-07-19
1776
Artikel HausmeisterIn
Ohne die Daten genau zu kennen würde ich, wie auch renee, vorschlagen mit $/ die Trennung der Datensätze zu erledigen. Löschen von Zeilentrennzeichen geht mit dem tr//-Operator und Extraktion fest positionierte Bereiche mit substr.
Insgesamt könnte das Programm also etwa so aussehen: perl -e '$/ = "<>"; $\ = "\n"; while (<>) { y/\r\n//d; print substr($_, 37, 15) if (substr($_, 9, 3) == 580) }'
When C++ is your hammer, every problem looks like your thumb.
rk-ger
2008-02-21 16:11
User since 2006-08-07
45
Artikel BenutzerIn
Perfekt! Vielen Dank.
print .. if .. muss ich mir merken. Habe ich so noch nie verwendet.
renee
2008-02-21 16:42
User since 2003-08-04
14371
Artikel ModeratorIn
@murphy: <klugscheiss>das $\ = "\n"; kannst Du durch den -l-Switch bei Perl weglassen (also: perl -le '...') </klugscheiss>