Leser: 29
perl -e ' $unique=0; while(<>) { if (!($save{$_}++)) { print $_; $unique++ } } warn "\nChose $unique unique lines out of $. total lines.\n\n" ' all > unique
1 2 3 4 5 6 7 8 9 10 11
my %uniqe=(); # durchlaufe das Array rückwärts for my $cnt (reverse (0..$#liste)) { # ein String generieren der "eindeutig" ist my $line=join(',',@{$liste[$cnt]}); # entferne die Zeile aus dem Array wenn sie schon einmal gefunden wurde splice(@liste, $cnt,1) if($uniqe{$line}); # setze diese Zeile als gefunden; $uniqe{$line}++; }
1 2
my %unique=map{(join(',',@$_),1)}@liste; @liste=map{[spit(',',$_)]}keys(%unique);
1
2
3
4
5
6
7
8
9
10
11
@liste = `cat test.tab`;
my %unique=map{(join(',',@$_),1)}@liste;
@liste=map{[split(',',$_)]}keys(%unique);
foreach $liste (@liste)
{$count++;
print $liste;
}
print "$count\n";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@liste = `cat test.tab`;
my %uniqe=();
# durchlaufe das Array rückwärts
for my $cnt (reverse (0..$#liste))
{
# ein String generieren der "eindeutig" ist
my $line=join(',',@{$liste[$cnt]});## print $line printet nichts!!!
# entferne die Zeile aus dem Array wenn sie schon einmal gefunden wurde
splice(@liste, $cnt,1) if($uniqe{$line});
# setze diese Zeile als gefunden;
$uniqe{$line}++;print "$cnt\n";
}
foreach $liste (@liste)
{print $liste;}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
my @spalte1; my @spalte2; #... my @spalteN; unique( \@spalte1, \@spalte2, ... \@spalteN ); sub unique { my( @cols ) = @_; my %u; for my $i ( reverse 0 .. $#{ $cols[0] } ) { if ( $u{ join( $;, map { $_->[$i] } @cols ) }++ ) { splice( @$_, $i, 1 ) for @cols; } # if } # for } # unique
1 2 3 4 5 6 7 8
my @liste=( \@zeile1, \@zeile2, \@zeile3, \@zeile4, #... \@zeilen )
my $wert=$liste[$ZeilenNr]->[$SpaltenNr]
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
# bitte immer strict und warnings nutzen, # du bekommst dann bei vielen Fehlern Meldungen, # die perl ansonsten versuchen würde zu interpretieren. use strict; use warnings; # Dateiname der Datei, # welche die Zeile enthält # wie erstellst du die Datei? # Ich vermute mal, # dass du nicht immer eine Datei erstellen willst # um eindeutige Zeilen zu bekommen, oder? # Das ganze geht definitiv auch ohne Datei my $file='test.tab'; # macht das selbe wie # @liste = `cat test.tab`; open(my $fh,'<',$file) or die("ERROR open $file ($!)"); my @liste=<$fh>; close($fh); # unique ist ein Hash # ein Hash hat die Besonderheit, # dass alle Schlüssel(keys genannt) einzigartig sind, # dh, sie tauchen niemals doppelt auf. # das ist soweit klar? my %uniqe=(); # durchlaufe das Array rückwärts for my $cnt (reverse (0..$#liste)) { # die Zeile die oben ausgelesen wurde my $line=$liste[$cnt]; # entferne die Zeile aus dem Array wenn sie schon einmal gefunden wurde # wenn $line als Schlüssel in %unique schon mal vorgekommen ist ( "if($unique{$line})" ), # dann löschen wir die Zeile aus den Array @liste ( "splice(@liste, $cnt,1)" ) splice(@liste, $cnt,1) if($uniqe{$line}); # nun Zählen wir den Wert, # der zum Schlüssel $line gehört, um 1 hoch $uniqe{$line}++; # man kann hier auch schreiben: # $uniqe{$line}=1; # das gibt die Aktuelle Zeilennummer aus print "$cnt\n"; } # alles testweise ausgeben: for my $line (@liste) { print $line; }
2010-02-26T19:37:28 gmafxOffensichtlich werden hier Datenstrukturen genutzt, die meinen Horizont überschreiten (ich kann Skalar, Array und ein Grundlagen mit Hashs, leider verstehe ich zB. nicht so etwas wie: $uniqe{$line}- sieht aus wie eine Referenz, oder? Dann muss man das auch wieder dereferenzieren, um es zu drucken, oder?
1 2 3 4 5 6 7 8 9 10 11
my $wert=''; my %hash=(); $wert='bla'; $hash{$wert}=1; $wert='foo'; $hash{$wert}=1; $wert='bar'; $hash{$wert}=1;
1 2 3 4 5 6 7
my @liste=('bla','foo','bar'); my %hash=(); for my $wert (@liste) { $hash{$wert}=1; }
2010-02-26T19:37:28 gmafxZudem bedeuten beide Ansätze, dass ich die Struktur meiner Daten erst invertieren muss (ich habe die Spalten in einzelnen Arrays, jetzt brauche ich jeweils Reihe für Reihe als Element eines einzigen Arrays).
Da muss ich erst mal meine Daten "übersetzen".
1 2 3 4 5
while(my @line=read_line_von_irgendwo) { my $zeilendaten=join(',',@zeile); push(@liste,$zeilendaten); }
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
my @liste; # ... while( my @line=lese_zeilen_von_irgendwo() ) { my $zeilendaten=join(',',@zeile); push(@liste,[@zeile]; # oder: # push(@liste,\@zeile; } # ... # nun wollen wir nur die Zeilen, die einzigartig sind my %uniqe=(); # durchlaufe das Array rückwärts for my $cnt (reverse (0..$#liste)) { # ein String generieren der "eindeutig" ist my $line=join(',',@{$liste[$cnt]}); # entferne die Zeile aus dem Array wenn sie schon einmal gefunden wurde splice(@liste, $cnt,1) if($uniqe{$line}); # setze diese Zeile als gefunden; $uniqe{$line}++; } for(@liste) { print join(', ',@$_)."\n"; }
1
2
3
4
5
6
7
8
9
10
11
12
13
@array=&del_double(@array);
$count=0;
foreach $array (@array)
{$count++;}
print "unique lines: $count\n";
sub del_double{
my %all;
grep {$all{$_}=0} @_;
return (keys %all);
}
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
use strict; use warnings; use Data::Dumper; my @columns_duplicates = ( [qw[1 2 3 2 4 4]], [qw[a b c b d d]], [qw[x y z y u u]] ); print Dumper \@columns_duplicates; my @columns_unique = do { my %seen; my @rows = grep { my $row = $_; not $seen{ join "\0", map { $_->[$row] } @columns_duplicates }++ } $[ .. $#{$columns_duplicates[0]}; map { [ @$_[@rows] ] } @columns_duplicates; }; print Dumper \@columns_unique;
2010-02-27T17:41:21 gmafxGinge auch was mit oben beschriebener Struktur, oder ist von dieser generell abzuraten? Wahrscheinlich schon, denn ich denke, dass viele Abläufe, die man standardmäßig mit Tabellen durchführt, eher schwierig werden könnten (zum Beispiel Sortieren).
1 2 3 4 5 6 7
my @cols = ( [qw/ 1 2 3 4 5 1 6 7 8 9 1 /], [qw/ u b c d e a f g h i z /], ); my @idx = sort { $cols[0][$a] <=> $cols[0][$b] } 0 .. $#{ $cols[0] }; @$_ = @$_[@idx] for @cols;
1 2 3 4 5 6 7 8 9 10 11
my @rows = ( [qw/ 1 a /], [qw/ 6 b /], [qw/ 5 f /], [qw/ 3 v /], [qw/ 9 c /], [qw/ 2 a /], ); my @idx = sort { $rows[$a][0] <=> $rows[$b][0] } 0 .. $#rows; @rows = @rows[@idx];