Portál AbcLinuxu, 11. května 2025 23:21

Dotaz: Mazání se soboru v Perlu

11.11.2009 12:03 TAPSOFT
Mazání se soboru v Perlu
Přečteno: 441×
Odpovědět | Admin
Prosím o pomoc. V stat1.txt souboru mám třeba toto nick1 nick2 nick2 nick4 a já potřebuji pomocí příkazu smazat určitý nick x

do souboru to zapisuji takto open(STATISTIKA, ">>stat1.txt"); print STATISTIKA "$nick\n"; close(STATISTIKA);

Za pomoc moc děkuji

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

11.11.2009 12:40 moira | skóre: 30 | blog: nesmysly
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zkusil bych příkaz grep (existuje i v Perlu).
Překladač ti nikdy neřekne: "budeme kamarádi"
11.11.2009 13:09 TAPSOFT
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
příkaz grep jsem v perlu sice našel,ale nikde jeho použítí jak vymazat určité dané slovo ze souboru
11.11.2009 13:17 myšák | skóre: 26 | blog: EmentuX | Ostrava
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nezkoušel jsem, takže jen rychle od boku (netvrdím, že je to optimální způsob, grep by asi byl jednodušší):
$file = "stat1.txt";
$nick = "nick xx";

open (FILE, "<$file") or die "Can't open $file: $!\n";
@lines = <FILE>;
close FILE;

open (STDOUT, ">$file") or die "Can't open $file: $!\n";

foreach $line ( @lines ) {
    print $line unless /$nick/;
}
close STDOUT;
Je nesmírně těžké být idiotem, konkurence je obrovská...
11.11.2009 13:49 TAPSOFT
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
děkuji ti moc,jdu hned zkusit
11.11.2009 14:07 TAPSOFT
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
tak tohle nefunguje
11.11.2009 14:48 NeoV | skóre: 23
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu

Tu to maaas:

use strict;

my $file = "aaa"; # zazov suboru
my $nick = "nick xx"; # nick na vymazanie

my @lines;

open (FILE, "<$file") or die "Can't open $file: $!\n";
while(<FILE>) { push @lines,$_; }
close FILE;

open (STDOUT, ">$file") or die "Can't open $file: $!\n";

for my $line ( @lines ) {
print STDOUT $line unless($line =~ /$nick/);
}
close STDOUT;

11.11.2009 15:31 moira | skóre: 30 | blog: nesmysly
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
Blok while(<FILE>) { push @lines,$_; } se dá nahradit kratším @lines=<FILE>;
Překladač ti nikdy neřekne: "budeme kamarádi"
11.11.2009 15:08 myšák | skóre: 26 | blog: EmentuX | Ostrava
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
Jak "nefunguje"? Píše to něco? Nefunguje to jak sis představoval? Co to dělá? Křišťálovou kouli nemám...
Je nesmírně těžké být idiotem, konkurence je obrovská...
11.11.2009 15:37 NeoV | skóre: 23
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
No ale tu koli nema ani on :-D

btw. tvoj kod je v podstate cely spravne :-) Su tam 'len' 2 chyby na jednom riadku:
print $line unless /$nick/;
spravne to mas mat:
print STDOUT $line unless($line =~ /$nick/);
11.11.2009 15:48 myšák | skóre: 26 | blog: EmentuX | Ostrava
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
No já chápu, že tazatel je asi (co se týče PERLu) mimo, ale napsat "nefunguje to" je fakt luxusní odpověď. :-)

btw. Ten kod je v podstate správně až na tu podmínku - někde mi to uteklo při editaci a zbyl mi tam jen "pahýl" ... nicméně ještě tam musí být (alespoň podle té struktury stat1.txt dle tazatele) ten $nick "orámovaný", aby to nebralo násobné výskyty řetězce nebo části jiných (nick 1 vs. nick 10, nick 11 atd.)

PS: Nehledě na to, že to celé jde napsat ještě PERLověji :-D
Je nesmírně těžké být idiotem, konkurence je obrovská...
11.11.2009 17:18 TAPSOFT
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
nejsem mimo,ale tohle je jen holý mazání,musím to vložit do robota o 4500 řádkách a ještě nastavit proměnné a příkazy které to mažou,takže to trvá trochu déle než ti vyzkouším
11.11.2009 15:48 TAPSOFT
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
Předtím to nick neodebralo,ale ted to odebere a je to super,jsi fakt machr,děkuji moc
11.11.2009 16:10 myšák | skóre: 26 | blog: EmentuX | Ostrava
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
No machr rozhodně ne, ten by ti to napsal jako one-liner :-D :-D :-D :-D
Je nesmírně těžké být idiotem, konkurence je obrovská...
11.11.2009 17:20 TAPSOFT
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
ale jo jde ti to,no to víš kdo umí,ten umí
11.11.2009 19:19 TAPSOFT
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
ještě jeden dotaz,co když je ale v té složce nick = Jsi na blacklistu-důvod.... nick2 = Jsi na blacklistu-důvod.... a já tím pádem potřebuji vymazat celý řádek kterýbych ale hledal podle nick
11.11.2009 20:15 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
v tom prípade použi výraz m/^$nick\b ... \b = zero length word boundary, t.j. za $nick môže byť koniec riadku alebo ľubovoľný znak iný ako alfanumberický
11.11.2009 21:20 TAPSOFT
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
super,děkuji
Řešení 1× (sdsdsd)
11.11.2009 15:41 myšák | skóre: 26 | blog: EmentuX | Ostrava
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
OK. Je tam jedna chyba -> regexp u unless má být správně unless ($line =~ /^$nick$/) jinak by to bralo pro nick1 i řádky nick10, nick11 atd. Takže správně takto:
#!/usr/bin/perl

$file = "stat1.txt";
$nick = "nick 1";

open (FILE, "<$file") or die "Can't open $file: $!\n";
@lines = <FILE>;
close FILE;

open (STDOUT, ">$file") or die "Can't open $file: $!\n";

foreach $line ( @lines ) {
    print $line unless ($line =~ /^$nick$/);
}
close STDOUT;
Je nesmírně těžké být idiotem, konkurence je obrovská...
11.11.2009 15:48 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
ak už dávaš celý súbor do pamäti, prečo nepoužiješ grep ?
$file = "stat1.txt";
$nick = "nick 1";

open (INFILE, "<$file") or die "Can't open $file: $!\n";
open (OUTFILE, ">$file.new") or die "Can't open $file.new: $!\n";

print OUTFILE grep $line !~ /^$nick$/, <INFILE>;

close INFILE;
close OUTFILE;

unlink "$file";
rename "$file.new", "$file";
11.11.2009 16:09 NeoV | skóre: 23
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
no pokial sa hrame na zvrhlosti typu kto da najmansi kod, tak potom :-):
$file = "stat1.txt";
$nick = "nick 1";

open(STDOUT, ">${file}.part");
open(STDIN, "<$file");

print for grep !/^$nick$/, <>;
rename("${file}.part",$file);
11.11.2009 16:33 myšák | skóre: 26 | blog: EmentuX | Ostrava
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
Případně ten stat1.txt flákneme jako argument toho skriptu a o zabackupovaný původní file ať se stará někdo jiný :-D :-D
#!/usr/bin/perl
$^I = "~";
$nick = "nick 6";
while (<>) {
	print unless /^$nick$/;
}
Je nesmírně těžké být idiotem, konkurence je obrovská...
12.11.2009 14:14 ph0enix | skóre: 18 | Praha
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu

To pak staci i

#!/usr/bin/perl
$nick = "nick 6";
print grep {!/^$nick$/} <>;
12.11.2009 14:51 myšák | skóre: 26 | blog: EmentuX | Ostrava
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
Tak mě napadá ... nešel by ten nick hodit jako druhý parametr? :-)
Je nesmírně těžké být idiotem, konkurence je obrovská...
12.11.2009 15:21 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
takto ? :-D #!/usr/bin/perl -n BEGIN { $nick = pop }; /^$nick\b/ || print;
12.11.2009 15:23 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
oops, <code> miesto <pre> :-(
12.11.2009 15:40 myšák | skóre: 26 | blog: EmentuX | Ostrava
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
Joooooooooo! Já věděl že to jde :-D :-D Smekám! Miluju PERL ... akorát ho furt používám tak nePERLovsky, až se stydím :-(
Je nesmírně těžké být idiotem, konkurence je obrovská...
12.11.2009 17:27 ph0enix | skóre: 18 | Praha
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu

A co takhle?

perl -e '$n=pop;print grep{!/^$n\b/}<>' data.txt nick6
12.11.2009 00:03 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
Pokud ten nick cpete do regexpu tak by to chtělo \Q, \E a /o.
In Ada the typical infinite loop would normally be terminated by detonation.
12.11.2009 08:49 NeoV | skóre: 23
Rozbalit Rozbalit vše Re: Mazání se soboru v Perlu
alebo staci pouzit funkciu quotemeta

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.