Anzeige:
Ergebnis 1 bis 10 von 10

Thema: Bash: sort

  1. #1
    Registrierter Benutzer
    Registriert seit
    12.06.2008
    Beiträge
    27

    Bash: sort

    Hallo liebe Leser,

    ich möchte etwas recht simples lösen, weiß aber nicht wie.

    Ein Datensatz bestehend aus einer bestimmten Anzahl Zeilen und zwei Spalten soll sortiert werden.

    Allerdings, und jetzt kommts, darf dabei nur nach der ersten Spalte sortiert werden. Tauchen in der ersten Spalte doppelte Nennungen auf, müssen diese unsortiert in ihrer ursprünglichen Reihenfolge unterienander geschreiben werden.

    sort -k1,1 <file>

    leistet leider nicht den gewünschten Umfang, da doppelte Werte in der Spalte 1 trotzdem sortiert nach Kriterium Spalte 2 ausgegeben werden.

    Wie bewerkstellige ich meine Anforderung mit sort?

    Vielen Dank,
    sv

  2. #2
    Registrierter Benutzer
    Registriert seit
    20.09.2005
    Beiträge
    61
    Hallo,
    zeig uns doch mal ein Beispiel, also einen IST-Stand und auch einen SOLL-Stand.
    Dann kann man das mal praktisch für Dich probieren.
    Gruß zst

  3. #3
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    stellst du dir sowas vor:

    Code:
    perl -F, -ane 'push @{$h{$F[0]}},$_ }{ print @{$h{$_}} foreach sort{ $a <=> $b } keys(%h)' DATEINAME
    Geändert von msi (13-04-2010 um 23:19 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    12.06.2008
    Beiträge
    27

    Minimalbeispiel

    @msi: Ich verstehe deinen Code leider nicht.

    Das Schema der Ausgangsdatei:

    Code:
    1  0.5
    2  3 
    3  5
    4  8
    2  2
    3  4
    Gewünschtes Ergebnis:

    Code:
    1  0.5
    2  3 
    2  2
    3  5
    3  4
    4  8
    Hab es wie gesagt mit
    Code:
     sort -k1,1
    probiert, leider sieht das Ergebnis dann so aus:

    Code:
    1  0.5
    2  2
    2  3 
    3  4
    3  5
    4  8
    Was kann ich tun?
    Geändert von superviser (14-04-2010 um 12:13 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    20.09.2005
    Beiträge
    61
    Hallo superviser,
    das Problem ist interessant. Du hast eigentlich die richtige Lösung, nur leider funktioniert sie nicht. Über einen Umweg geht es aber schon.
    Nehmen wir an, Deine Datei heißt "DEINEDATEI".
    Dann funktioniert es so zum Beispiel:
    Code:
    nl DEINEDATEI  | sort -k 2,2 | cut -f2-
    Das Ergebnis ist dann:
    1 0.5
    2 3
    2 2
    3 5
    3 4
    4 8

    Keine schöne Lösung, aber immerhin. Vielleicht hat ja noch jemand eine Idee für Dich.
    Gruß zst

  6. #6
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    wieso verwendest du nicht einfach die --stable (-s) Option von sort? Damit klappts jedenfalls bei mir:
    Code:
    sort -k 1,1 -s input
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  7. #7
    Registrierter Benutzer
    Registriert seit
    20.09.2005
    Beiträge
    61
    Hallo jeebee,

    GENIAL !!!
    Das ist es.

  8. #8
    Registrierter Benutzer
    Registriert seit
    12.06.2008
    Beiträge
    27
    Vielen vielen Dank an euch beide.

    Die stabile Version ist natürlich die Elegantere.

    Funktioniert auch für meinen Anwendungsfall tadellos. Kannst mit noch erklären was da genau passiert? Werde aus der man nicht richtig schlau. Was bedeutet "disabling last-resort"? Wird da immer der von -k nicht umfasste Bereich von der Sortierung ausgeschlossen?

  9. #9
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Code:
    echo "1  0.5
    2  3
    3  5
    4  8
    2  2
    3  4" | 
    perl  -ane 'push @{$h{$F[0]}},$_ }{ print @{$h{$_}} foreach sort{ $a <=> $b } keys(%h)'
    funktioniert bei mir wuderbar, das Trennzeichen (mit -F ) hatte ich im ersten Posting auf , gesetzt gehabt. Wenn du den Parameter weglässt werden Leerzeichen verwendet.

  10. #10
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    stable sort bedeutet, dass wenn zwei Einträge den gleichen Key haben, diese in der Original-Reihenfolge im Resultat erscheinen.
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •