Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6951[/thread]

best.Zeile + darauffolgende Zeilen löschen (Seite 2)



<< |< 1 2 >| >> 18 Einträge, 2 Seiten
Strat
 2005-05-03 18:46
#54496 #54496
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn dich sowas mehr interessiert: auf meiner HP steht auch unter Vortraege was zu "Perl in der Kommandozeile" (als Powerpoint)

Eine weitere vermutlich funktionierende Loesung waere die folgende:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#! /usr/bin/perl
use warnings;
use strict;

my $infile = "irgendwas.txt";
my $outfile = "out.txt";

# dateien oeffnen
unless (open (IN, "<", $infile)) {
 die "Error in opening '$infile': $!\n";
} # unless
unless (open (OUT, ">", $outfile)) {
 die "Error in opening '$outfile': $!\n";
} # unless

# in schleife Daten einlesen; $_ enthaelt jeweils eine Zeile
while (<IN>) {

 # wenn in der Zeile das Wort NOID vorkommt:
 if ($_ =~ /\bNOID\b/) { # oder kuerzer: if (/\bNOID\b/) {
   for my $i (1..4) { # werfe die folgenden vier zeilen weg
     my $dummy = <IN>;
   } # for
 } # if

 # sonst schreibe sie nach OUT
 else {
   print OUT $_;
 } # else

} # while

# dateien wieder schliessen
close(IN); close(OUT);


mich laesst aber vermuten, dass in der Datei eine datenstruktur vorkommt, die auf bloecken beruht und nicht auf zeilen. wenn du dieses format naeher beschreibst, finden wir vielleicht eine kuerzere loesung.

Nebenbei: auf meiner HP steht unter Vortraege meine "Einfuehrung in Perl", die dir vielleicht den einstieg ein klein wenig erleichtern kann\n\n

<!--EDIT|Strat|1115131736-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2005-05-03 18:58
#54497 #54497
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Dubu,03.05.2005, 10:51]
Code: (dl )
perl -ne '$cnt=4 if /NOID/; print unless $cnt && $cnt--;' datei_alt.txt > datei_neu.txt
[/quote]
@Dubu: wie gefaellt dir:
Code: (dl )
perl -i.bak -ne '/\bNOID\b/&&$c=4;($c-->0)||print' datei.txt 

(hab's allerdings nicht getestet)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pKai
 2005-05-03 20:00
#54498 #54498
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
@Strat: && bindet stärker als =, daher Klammern um die Zuweisung nötig oder and verwenden.
I sense a soul in search of answers.
Strat
 2005-05-03 20:11
#54499 #54499
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
stimmt, also
Code: (dl )
perl -i.bak -ne '/\bNOID\b/&&($c=4);($c-->0)||print' datei.txt 

Aus ist es mit der schoenheit...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pKai
 2005-05-03 20:14
#54500 #54500
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=Strat,03.May.2005, 18:11]Aus ist es mit der schoenheit...[/quote]
Och,
Code: (dl )
perl -i.bak -ne '/\bNOID\b/and$c=4;($c-->0)||print' datei.txt

ist doch net schlecht! Vor allem --> gefällt mir. ;)
I sense a soul in search of answers.
Dubu
 2005-05-03 21:47
#54501 #54501
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Erstmal dank an Ronnie, dass er meinen Code erklaert hat. 8)

Und dann @strat: Doch, ist schick. Aber sicherlich noch etwas unuebersichtlicher als meine Zeile. ;)

@StefanJ: Sorry, fuer einen Perl-Einsteiger ist das sicher etwas heftig. Aber es sollte genau das machen, was du beschrieben hast, inkl. mehrfachem Auftreten von "NOID". Man kann das ganze auch vom Einzeiler in ein Programm umschreiben. Leider hast du nicht gesagt, wie dem Programm die Datei uebergeben werden soll.

Unix- oder Linux-Shell-Anhaenger arbeiten gerne mit Pipes und Filtern, und dafuer sind so Perl Einzeiler ideal: Einlesen von STDIN (was Perl mit "-n" oder "-p" automatisch macht, und das auch, wenn ein Dateiname als Argument angegeben ist), STDOUT umleiten in andere Datei oder eine Pipe. So mache ich es auch meistens.

Die meisten Windows-Programmierer tendieren eher dazu, Dateinamen entweder fest in den Code zu kodieren oder die Dateinamen als Argumente explizit einzulesen und auch explizit im Programm zu oeffnen (und zu schliessen). Schliesslich werden Programme (und auch Perlskripte) dort meist eher durch Anklicken gestartet als auf der Kommandozeile.

Hier mein Code mal mit einkodierten Dateinamen, und auch mit Netz und Sicherheitsleine (strict und warnings):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;

my $EingabeDatei = 'datei_alt.txt';
my $AusgabeDatei = 'datei_neu.txt';

open (IN,  '<', $EingabeDatei) or die "Kann $EingabeDatei nicht oeffnen: $!";
open (OUT, '>', $AusgabeDatei) or die "Kann $AusgabeDatei nicht oeffnen: $!";

my $count = 0;       # Anzahl zu loeschender Zeilen
while (<IN>) {
   if (/NOID/) {
       $count = 4;    # 3 Zeilen + diese sollen nicht ausgegeben werden
   }
   if ($count == 0) {
       print OUT;    # Zeile nach OUT ausgeben
   } else {
       --$count;    # eins weniger
   }
}


Wenn du die Zeilen in der Datei selber loeschen moechtest (d.h. ohne zusaetzliche Ausgabedatei), dann kannst du z.B. beim Einzeiler einen zusaetzlichen Parameter wie -i.bak benutzen, -i steht fuer "in place", mit .bak wird die alte Datei mit Endung .bak gesichert. (Tatsaechlich wird immer eine neue Datei erzeugt, aber diese dann mit .bak umbenannt, und die neue Datei bekommt den Namen der alten.)

Wenn man wirklich ohne Datei zum Zwischenspeichern auskommen moechte, wird es etwas aufwaendiger, wie du schon gesehen hast.
Ronnie
 2005-05-03 23:17
#54502 #54502
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=Dubu,03.05.2005, 19:47]Erstmal dank an Ronnie, dass er meinen Code erklaert hat. 8)[/quote]
So schöne Einzeiler erkläre ich gerne mal! :D
StefanJ
 2005-05-04 17:02
#54503 #54503
User since
2005-05-03
35 Artikel
BenutzerIn
[default_avatar]
Saucool, vielen Dank Leude! Klappt alles soweit! Mit Dubu's letztem Post funktioniert es einwandfrei! Hätte vielleicht erwähnen sollen wie die Textdatei aussieht. und ich wohl zu den "Windows-Programmierer" gehöre ! :-)
War mir ein Fest mit euch, danke nochmal!

Gruss,

StefanJ
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2005-05-03 11:38.