Schrift
[thread]11682[/thread]

Zeilen in Datei vergleichen, doppelte löschen?!

Leser: 3


<< >> 6 Einträge, 1 Seite
yasukatakaya
 2008-04-22 10:57
#108683 #108683
User since
2007-05-31
68 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich habe folgedendes Problem ich will eine Datei nach doppelten Zeilen durchsuchen, wenn eine Zeile gleich der anderen ist, soll eine davon gelöscht werden, in der Datei kommt so z.B. das Wort r1233 mehrmals vor!
Die Datei kann so aussehen:
Code: (dl )
1
2
3
4
5
6
r1233
r1456
r1233
r1233
r9786
etc.


Soll danach so aussehen:
Code: (dl )
1
2
3
4
r1233
r1456
r9786
etc.


Ich hab folgendes probiert, aber klappt irgendwie nicht?
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
	
open (INPUT,"<YES_$ziel.txt") || die $!;

while (<INPUT>)
{
foreach $doppelt1 ($_ =~ /\w{1,2}\d{4}/g)
{
open (INPUT2,"<YES_$ziel.txt") || die $!;
open (OUTPUT2,">YES_$ziel.txt") or die "konnte $ziel nicht oeffnen,$!\n";

while (<INPUT2>)
{
foreach $doppelt2 ($_ =~ /\w{1,2}\d{4}/g)
{
#print "$doppelt2\n";
#wenn $doppelt1 und $doppelt2 gleich sind, dann soll eins davon gelöscht werden
if($doppelt1 eq $doppelt2)
{
unlink $doppelt2;
}
else
{
print OUTPUT2 "$doppelt1\n";
}
}
}
close INPUT2;
}
}
close INPUT;

Ich hoffe mir kann jemand weiterhelfen, ich danke schonmal im Voraus!
renee
 2008-04-22 11:39
#108684 #108684
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du könntest für diese Aufgabe das Modul CPAN:Tie::File verwenden. Damit wird pro Element eine Zeile der Datei gespeichert. Dann kann man die doppelten löschen und das Ergebnis wird automatisch wieder in der Datei gespeichert.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use strict;
use warnings;
use Tie::File;

my $file = '/pfad/zur/datei';

tie my @lines, 'Tie::File', $file or die $!;
my %seen;
@lines = grep{ !$seen{$_}++ }@lines;
untie @lines;
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/
nepos
 2008-04-22 12:19
#108692 #108692
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn die doppelten Zeilen immer hintereinander stehen und du unter Linux oder ähnlichem unterwegs bist, sollte das Tool uniq das gewünschte erledigen.
GwenDragon
 2008-04-22 12:26
#108697 #108697
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
In der Shell erst an sort pipen und dann an uniq.
nepos
 2008-04-22 12:53
#108698 #108698
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Oder
Code: (dl )
sort -u
.
Linuxer
 2008-04-22 13:56
#108705 #108705
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
nepos+2008-04-22 10:53:19--
Oder
Code: (dl )
sort -u
.

Damit habe ich bereits erlebt (schon eine ganze Weile her), dass es dabei zu Fehlern kommen kann und nicht wirklich alle Duplikate entfernt werden.
Daher bevorzuge ich GwenDragons Vorschlag und würde den auch so empfehlen.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< >> 6 Einträge, 1 Seite



View all threads created 2008-04-22 10:57.