Unix Befehl: sort -u geeignet?

GWFgamer

Ensign
Registriert
Juli 2006
Beiträge
167
Hallo liebe Community,

ich befasse mich zur Zeit mit Kommandos unter Unix/ Solaris in der Kommandozeile und habe folgendes Problem, dass ich mithilfe des Befehls sort -u zu lösen versuche. Gegeben ist eine Datei z.B. "Computer.txt" mit mehreren Datensätzen (jeder Datensatz dargestellt durch eine Zeile), jedes Feld ist z.B. durch ein Komma abgetrennt:

Computer,8888,2222,7777,0001,
Computer,8887,2222,7777,0001,
Computer,8889,2222,7777,0002,
Computer,8886,2222,7777,0002,

Ich versuche nun, nur die Zeilen auszugeben, die im z.B. letzten Feld einzigartig sind, sprich so sollte das Ergebnis aussehen:

Computer,8888,2222,7777,0001,
Computer,8889,2222,7777,0002,

Normalerweise könnte dies ja mit
Code:
cat Computer.txt | sort -u
realisiert werden, wenn es da nicht auch noch andere Felder gäbe (in diesem Fall das zweite), die auch varieren können (mich aber nicht interessieren).

Meine Idee war, über
Code:
cat Computer.txt | cut -d "," -f 4 | sort -u
mich auf das vierte Feld zu beschränken (zumindest zum identifizieren von uniques) .. allerdings wird in diesem Fall natürlich auch nur das letzte Feld ausgeben ...

Habt ihr eventuell eine Idee, wie ich beschränkt auf ein Feld diese Datensätze sortieren bzw. die mit dem selben (z.B.) letzten Feld aussortieren kann? Dabei ist egal, welcher der "Semi-Duplikat-Datensätze" verschwindet. Schleifen sollen nicht verwendet werden, es soll alles in "einem" Befehl untergebracht sein ;)

Vielen Dank für eure Ideen jetzt schon einmal, ich hoffe ich habs nicht zu kompliziert ausgedrückt :)
 
Schau dir mal den Befehl "uniq" an, sollte eher nützlich sein für deine Zwecke.
 
Code:
sort -t, -k5 -u Computer.txt

Aber Deine Frage ist imho im falschen Unterforum, das gehört wohl eher nach "Linux".
@Mod: Bitte verschieben


HTH

BigNum
 
Entschuldigung, Unix wäre tatsächlich passender gewesen.

Danke für die bisherigen Antworten! Werde ich auf jeden Fall ausprobieren :)
Ergänzung ()

Ich bis nochmal! Hat super funktioniert!

Wie sieht das denn jetzt aus, wenn ich jetzt danach noch von einem zweitenFeld abhängig machen will, welcher "doppelte " Datensatz (aufgrund von sort -t, -k5 -u Computer.txt) aussortiert wird?

Also wenn man z.B zusätzlich das zweite Feld dazu nimmt ... und immer der doppelte Datensatz mit der (z.B.)groeßeren Zahl im zweiten Feld aussortiert wird ... das die Ausgabe z.B. folgend aussieht

Computer,8887,2222,7777,0001,
Computer,8886,2222,7777,0002,

Vorsortieren nach dem zweiten Feld hab ich schon versucht .. leider scheint sort -u nicht unbedingt den ersten Datensatz zu nehmen, den es findet.. hat jemand eine Idee? :)
 
Vielen Dank.

Allerdings strebe ich eine Lösung mit einem Befehl an. Ich hatte schon einmal an

Code:
cat Computer.txt | sort -t, -k2,2 -r | sort -t,  -k5 -u

gedacht, um das zweite feld vorzusortieren ... aber scheinbar greift sich sort -u nicht unbedingt die erste zeile die es findest, sondern macht das von irgendwas anderem abhängig (z.B. vom ersten Feld einer jeden Zeile, ich weiss es nicht .. in diesem Beispiel wuerde das eventuell sogar funktionieren, ist ja aber nur nen Beispiel) =S
 
Zuletzt bearbeitet:
GWFgamer schrieb:
Wie sieht das denn jetzt aus, wenn ich jetzt danach noch von einem zweitenFeld abhängig machen will, welcher "doppelte " Datensatz (aufgrund von sort -t, -k5 -u Computer.txt) aussortiert wird?

Also wenn man z.B zusätzlich das zweite Feld dazu nimmt ... und immer der doppelte Datensatz mit der (z.B.)groeßeren Zahl im zweiten Feld aussortiert wird ... das die Ausgabe z.B. folgend aussieht

Computer,8887,2222,7777,0001,
Computer,8886,2222,7777,0002,
Dann ist das mit "einfachen" Mitteln nicht mehr (bzw. nur sehr umständlich und dementsprechend aufwändig) zu machen.

Für diesen Fall gibt es Perl (das bei jedem vernünftigen Linux/Unix-System mit dabei ist):

Für eine Beispieldatei. die so aussieht
Code:
Computer,8888,2222,7777,0001,
Computer,8887,2222,7777,0001,
Computer,8889,2222,7777,0002,
Computer,8886,2222,7777,0002,
Computer,8889,2222,7777,0003,
Computer,8886,2222,7777,0003,
Computer,8889,2222,7777,0004,
Computer,8886,2222,7777,0004,
Computer,8889,2222,6666,0004,
Computer,8886,2222,6666,0004,

liefert mein Perl-Script (ich habe es "sort5uk2.pl" getauft)
Code:
#!/usr/bin/perl -w

open(my $file, $ARGV[0]) or die "open failed:$!";
my %unique;
while(<$file>)
{
  my @parts= split(",", $_);
  if (!(exists($unique{$parts[4]}) && $unique{$parts[4]}->[2] le $parts[1] )) { $unique{$parts[4]}= [$_, $parts[4], $parts[1]]; }
}
close($file);

print map { $_->[0] } sort { $a->[1] cmp $b->[1] } values %unique;
bei einem Aufruf mittels
Code:
./sort5uk2.pl Computer.txt

folgende Ausgabe:
Code:
Computer,8887,2222,7777,0001,
Computer,8886,2222,7777,0002,
Computer,8886,2222,7777,0003,
Computer,8886,2222,7777,0004,

Du musst also das Perl-Script als "sort5uk2.pl" abspeichern, danach empfiehlt sich ein "chmod 700 sort5uk2.pl" (oder wahlweise auch "755" statt "700"), um das Script ausführbar zu machen.


HTH

BigNum
 
Sorry das ich mich so spät melde. Herzlichen Dank für die Hilfe, hat mir sehr weitergeholfen!

Letztendlich hat der Code es so sortiert, wie es aussehen sollte, Vielen DANK! :)
 
Zurück
Oben