track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
rklm schrieb: track schrieb: Durch das vorher sortieren gibt er in diesem Fall natürlich immer die niedrigste Zahl aus, nicht die erste. (Wenn sowas wichtig wäre, müsste man das ggf. per Hand selber programmieren, z.B. mit awk )
Auch nicht: dafür kann man die Option -s nehmen.
Oh. - hatte ich doch tatsächlich übersehen, dass es mit sort -uk1.11,1.18 auch geht, sogar genau so wie ich es mir vorstellte ! Die Option -n würde ich übrigens ausdrücklich nicht nehmen. Denn sonst geht es schief, wenn Buchstaben im Schlüsselbereich vorkommen. Und was die Option -s bewirken soll, ist mir schleierhaft. Mit den Testdaten oben bekomme ich jedenfalls keinen Unterschied im Ergebnis.** LG, track
Übrigens: eine Lösung mit awk ist nicht einmal besonders aufwendig, wenn man ein Merker-Array mitführt: (nur mal so, als Gedankenanstoß)
| awk '{key=substr($0,11,7); if(m[key]) next; print; m[key]=1}'
|
** Hat sich erledigt. (info sort sagt es klarer !) Hier, zwischen sort -uk1.11,1.18 und sort -suk1.11,1.18 gibt es tatsächlich keinen Unterschied. Man merkt den erst, wenn man sort -k1.11,1.18 mit sort -sk1.11,1.18 vergleicht: dann wird nämlich nicht mehr nach dem Rest, außerhalb des Keys nachsortiert, sondern die Reihenfolge bleibt einfach so wie sie vorher war.
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 729
|
Danke sehr, Der Befehl "sort -uk1.11,1.18" hat funktioniert und genau das, was ich gesucht habe. 👍 Aber welcher von den 3 Befehlen ist der bessere oder schnellere? sort -suk 1.4n x
sort -sunk 1.11,1.18 <<'DATA
oder
sort -uk1.11,1.18
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Was von der Sache her besser ist, das hängt von Deinen Daten ab bzw. davon was Du damit vorhast. Dazu hast Du aber bisher nichts weiter verraten. Von daher wissen wir zu wenig, um dazu was sagen zu können. Was das Tempo angeht, nehmen die sich alle nicht viel, selbst wenn Du Listen von 100 000 Zeilen damit bearbeiten würdest. LG, track
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
track schrieb:
Die Option -n würde ich übrigens ausdrücklich nicht nehmen. Denn sonst geht es schief, wenn Buchstaben im Schlüsselbereich vorkommen.
Ist das wirklich so? | $ sort -n <<'DATA'
> 123b
> 123a
> DATA
123a
123b
|
Die Reihenfolge passt, obwohl Buchstaben im Schlüssel vorkommen und -n benutzt wurde. Ah! Der Unterschied tritt erst zu Tage, wenn die numerischen Folgen unterschiedliche Länge haben: 1
2
3
4
5
6
7
8
9
10
11
12 | $ sort <<'DATA'
123a
24b
DATA
123a
24b
$ sort -n <<'DATA'
123a
24b
DATA
24b
123a
|
matze31 schrieb:
Aber welcher von den 3 Befehlen ist der bessere oder schnellere? sort -suk 1.4n x
sort -sunk 1.11,1.18 <<'DATA
oder
sort -uk1.11,1.18
Der erste macht ja etwas ganz anderes. Der Unterschied zwischen den beiden anderen ist in "-n" (numerisch sortieren) und "-s" (stabile Sortierung). Letzteres sollte dafür sorgen, dass immer die in der Eingabedatei als erstes auftretende Zeile mit einem mehrfach vorkommenden Muster auftritt. Es hängt davon ab, was Du möchtest, welches der korrekte Befehl ist.
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 729
|
Ich möchte einen X beliebigen EMM Datenstrom Auswerten.
Ich möchte mal sehen wieviel Karten es bei einen x beliebigen TV Anbieter gibt,
Den geloggten Datenstrom hab ich mit sort -uk1.x,1.xx. ausgewertet.
Somit habe ich immer nur eine Cardserial. Und dann lasse ich per wc die Zeilen Anzeigen.
Soweit so gut, aber bei 'sort -uk1.x,1.xx' als auch bei 'sort -sunk1.x,1.xx' bekomme ich unterschiedliche Ergebnisse (bei gleicher Datei)
Was ist nun richtig? Komisch
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
matze31 schrieb:
Was ist nun richtig?
Nochmal: das musst Du entscheiden. Lies Dir im Zweifel noch einmal die Manpage von sort durch.
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 729
|
ja, aber ich meinte warum kommen unterschiedliche Ergebnisse zustande?
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
matze31 schrieb: ... aber bei 'sort -uk1.x,1.xx' als auch bei 'sort -sunk1.x,1.xx' bekomme ich unterschiedliche Ergebnisse
und: ja, aber ich meinte warum kommen unterschiedliche Ergebnisse zustande?
Sicher kommen da verschiedene Ergebnisse: allei schon, weil beim 1. Befehl die Zeilen nach-sortiert werden (nach dem Rest, außerhalb des Schlüssels) und beim 2. nicht ( Option -s) Plus, dass durch die Option -n im 2. Fall die Zahlen nach ihrem Zahlenwert und nicht blind als Ziffernfolgen sortiert werden. In der Diskussion oben haben wir genau diese Unterschiede schon ausführlich diskutiert und mit Beispielen untermauert. → müsstest Du dort nochmal nachlesen. Was die konkrete Auswertung angeht, hast Du bisher immer nur Bruchstücke erzählt, was Du genau vorhast, und wie Du sortieren willst. Von daher wissen wir nach wie vor zu wenig, als dass wir dazu was sagen könnten. LG, track
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 729
|
Also nochmal,
Ich habe mir eine gesammelte EMM Datei (in diesen Fall sky) auf meinen Laptop kopiert.
Die Cardserial die Bedeutend ist, steht von 9. bis 16. Stelle, die ist vielmals doppelt, weil ja pro Karte verschiedene längen kommen.
Ich hab mir dann durch den Befehl 'cat meine.emm | sort -uk1.9,1.16 >>meine.emm1' die dopellten Cardserial (die an 9. bis 16. Stelle stehen)
so gelöscht, dass jeweils nur immer eine stehen bleibt.
Danach die Zeilen mit 'wc' gezählt und schon hatte ich ein Ergebniss was auch in etwa stimmen könnte.
Ich hoffe ich habe mich jetzt verständlich ausgedrückt.
Mir geht es ja nur ums Prinzip, weil man diese Anwendung immer mal braucht oder brauchen könnte. LG
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Gut - unter diesen Bedingungen müssten sort -uk1.x,1.xx und sort -suk1.x,1.xx (ohne -n !) beide gleich viele Treffer liefern, das ist richtig. Aber sort -su n k1.x,1.xx liefert was Anderes, sobald im Schlüssel Buchstaben vorkommen. Dann wird nämlich nur die Zahl bir zum 1. Buchstaben ausgewertet ! Kurzes Beispiel: track@track:~$ echo '123456
999x99
4444x7
999x24' | sort
123456 # die Ziffern werden blind, aufsteigend nach Spalte sortiert
4444x7
999x24
999x99
track@track:~$ echo '123456
999x99
4444x7
999x24' | sort -n
999x24 # hier nach Zahlenwert: 999 < 4444 < 123456
999x99
4444x7
123456
track@track:~$ echo '123456
999x99
4444x7
999x24' | sort -sn
999x99 # durch das -s wird der Teil hinter dem x nicht mehr sortiert,
999x24 # die Reihenfolge bleibt so wie sie kommt
4444x7
123456
track@track:~$ echo '123456
999x99
4444x7
999x24' | sort -snu
999x99 # bei -u erscheint nur der 1. Treffer (also 1 weniger !)
4444x7
123456
track@track:~$ echo '123456
999x99
4444x7
999x24' | sort -nu
999x99 # dabei ist es egal, ob noch nach-sortiert wird oder nicht
4444x7
123456 Am besten vergleichst Du Deine beiden Listen mal mit meld - da sieht man die Unterschiede am besten. LG, track
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 729
|
Aha ok danke.
Ich hatte ganz vergessen,dass Buchstaben mit drin sind.
Also Fahr ich mit 'sort -uk1.x,1.xx' am besten?! Und dann gebe ich einfach den Befehl 'wc -l datei.txt | cut -d " " -f 1' ein, und er zeigt mir hoffentlich die richtige Zeilen Anzahl an.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Ja. Das mit dem cut sieht ein bißchen eckig aus ... ich würde die Zeilen eher zählen mit cat datei.txt | wc -l oder sed -n $= datei.txt ... (ist aber Geschmackssache). track
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 729
|
|