Schrift
[thread]11338[/thread]

Suchen und gleichzeitig Zeilenvorschub ignorieren



<< >> 8 Einträge, 1 Seite
rk-ger
 2008-02-21 15:24
#106169 #106169
User since
2006-08-07
45 Artikel
BenutzerIn
[default_avatar]
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
#106174 #106174
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
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...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
rk-ger
 2008-02-21 15:45
#106175 #106175
User since
2006-08-07
45 Artikel
BenutzerIn
[default_avatar]
Das kann ich leider nicht. Datenschutz. Es handelt sich um Produktivdaten aus dem eCommerce-Bereich.
murphy
 2008-02-21 16:01
#106177 #106177
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
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
#106178 #106178
User since
2006-08-07
45 Artikel
BenutzerIn
[default_avatar]
Perfekt! Vielen Dank.

print .. if .. muss ich mir merken. Habe ich so noch nie verwendet.
renee
 2008-02-21 16:42
#106182 #106182
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@murphy: <klugscheiss>das $\ = "\n"; kannst Du durch den -l-Switch bei Perl weglassen (also: perl -le '...') </klugscheiss>
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
betterworld
 2008-02-21 18:30
#106191 #106191
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
renee+2008-02-21 15:42:46--
@murphy: <klugscheiss>das $\ = "\n"; kannst Du durch den -l-Switch bei Perl weglassen (also: perl -le '...') </klugscheiss>

Jo, und $/ kann man mit -O machen, und while(<>){...} kann man mit -n machen.
murphy
 2008-02-21 23:53
#106206 #106206
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@renee: Stimmt, daran hatte ich im Eifer des Gefechts gar nicht gedacht.

@betterworld: Du meinst wohl -0. Damit kann man aber nur ein einzelnes Zeichen als Separator festlegen, nicht "<>".
When C++ is your hammer, every problem looks like your thumb.
<< >> 8 Einträge, 1 Seite



View all threads created 2008-02-21 15:24.