auch ich mit sortieren

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von flappinski, 20.10.2006.

  1. #1 flappinski, 20.10.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    hallo ich habe folgendes Problem. Ich habe eine Datei, in der sehr viele Zeilen immer mit ca. 10 Feldern stehen. Ich will eine Ausgabe der Zeilen die das gleiche erste Feld haben.
    Jetzt bin ich schon so weit, dass ich eine Liste dieser Felder bekomme mit (sort.txt ist vorsortiert):

    awk -F "\t" '{print $1}' sort.txt | uniq -d

    jetzt brauche ich eigentlich diese Liste nur mit einem grep aus der sort.txt auszulesen. Wie mache ich das?
    Danke,
    Stephan
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Peregrine, 20.10.2006
    Peregrine

    Peregrine Honorarkonsul

    Dabei seit:
    03.08.2006
    Beiträge:
    338
    Zustimmungen:
    0
    Ort:
    München, Bayern, Germany
    Ich begreife nicht ganz, was du machen möchtest. Kannst du vielleicht kurz tippeln, was in der sort.txt steht und wie dein output aussehen soll?
     
  4. #3 Wolfgang, 21.10.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Ich vermute mal, dass du dir awk sparen kannst.
    sort kennt auch Feldtrenner und ein eingesetztes cut ist enorm effizienter als awk (falls du nur die erste Spalte ausgeben willst). Auch kannst du sort sagen, nach welchem Feld sortiert werden soll.

    Aber wie schon gesagt: Ein paar Beispieldaten mit erhofftem Ergebnis und verwendeter Shell bzw OS ist nötig.

    Gruß Wolfgang
     
  5. #4 flappinski, 24.10.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    ein bisschen spät...

    Hi,
    sorry, hatte gerade viel um die Ohren. Cut kannte ich noch gar nicht, sowas suche ich schon lange, vielen Dank schon mal dafür.
    So nun zum Grundproblem:
    Folgende Datei sort.txt:
    rs1 1 1.1 11.1
    rs2 2 2.1 22.1
    rs3 3 3.1 33.1
    rs4 4 4.1 44.1
    rs5 5 5.1 55.1
    rs4 6 6.1 66.1
    rs2 7 7.1 77.1
    rs6 8 8.1 88.1

    Wenn ich sortiere will ich das:
    rs2 2 2.1 22.1
    rs2 7 7.1 77.1
    rs4 4 4.1 44.1
    rs4 6 6.1 66.1

    Das bekomme ich im Moment nur so (bis getern mit umständichem awk -Befehl):
    cut -f 1 sort.txt | sort | uniq -d
    und das Ergebnis greppe ich dann von Hand. Ganz schön unelegant, oder?

    Das hier kommt meinem eigentlichen Problem recht nahe:
    sort +0 -1 sort.txt -u

    nur liefert das halt gerade die doppelten nicht. Aber immerhin sieht er das doppelte nur anhand des ersten Feldes, das ist genau mein Wunsch! Wie bekomme ich jetzt sort dazu mir nur die doppelten darzustellen, do ähnlich wie es uniq -D macht (dieser Befehl erkennt aber nur vollständig-doppelte Zeilen).

    Ach ja, ich benutze die bash auf einem UBUNTU 6.06 System. Habe ich jetzt alle Klarheiten beseitigt?
    Viele Grüsse und Danke schon mal,
    Stephan
     
  6. #5 flappinski, 24.10.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    Fortsetzung:
    habe gerade -f bei uniq gefunden. das ignoriert die ersten n Felder. Jetzt funktioniert das super, wenn mein ersten Feld an letzter Stelle steht, also so:
    rs1 1 1.1 11.1 rs1
    rs2 2 2.1 22.1 rs2
    rs3 3 3.1 33.1 rs3
    rs4 4 4.1 44.1 rs4
    rs5 5 5.1 55.1 rs5
    rs4 6 6.1 66.1 rs4
    rs2 7 7.1 77.1 rs2
    rs6 8 8.1 88.1 rs6

    und dann:
    sort sort.txt | uniq -f 4 -D
    das bringt genau das, was ich will! Nur wie bekomme ich das erst Feld an die letzte Stelle? Hat da jemand eine schnelle Lösung? Ohne Awk?
    uniq (GNU coreutils) 5.93
    Copyright (C) 2005 Free Software Foundation, Inc.
     
  7. #6 flappinski, 29.10.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    @ Wolfgang und Peregrine:
    jetzt habe ich mir die Mühe gemacht und ganz ausführiche Beispiele gebracht und dann seid ihr stumm? Schade, aber ich bin ja auch jast am Ziel, irgendwie wurschtel ich mich schon durch, dennoch danke,
    Stephan
     
  8. #7 Wolfgang, 29.10.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Ups
    Den Beitrag habe ich wirklich übersehen.
    Sorry!
    Da du ja nun eine Lösung gefunden hast, hat sich die sache doch erledigt oder?

    Dass du dir awk sparen kannst, habe ich vermutet bevor ich die genauen Daten kannte.
    In diesem Fall aber, würde ich das doch lieber gleich mit perl oder auch awk machen. Und zwar alles.

    Du kannst Natürlich auch mit einem while read Konstruckt die Teile vertauscht ausgeben. Allerdings musst du dann die Feldzahl kennen und sie sollte konstant sein.

    Code:
    cat text|while read V1 V2 V3 V4;
    do
    echo -ne "$V4 $V3 $V2 $V1 \n";
    done
    
    Gibt zum Beispiel alle Felder in umgekehrter Reihe aus.

    Gruß Wolfgang
     
  9. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Ups, jetzt war Wolfgang schneller. Aber egal, vielleicht hilft auch folgendes:

    Code:
    sort sort.txt | sed -e 's!^\([^ ]*\) \(.*\)$!\1 \2 \1!'
    
    Es ist nicht auf die Anzahl der Felder angewiesen.

    Gruss, Xanti
     
  10. #9 flappinski, 29.10.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    jep, vielen dank, jetzt bin ich fast ganz glücklich. es funktioniert soweit, nu den sed befehl kapier ich gar nicht. würde es Dir viel ausmachen, kurz zu erläutern, was da paseiert, Xanti? Da steige ich nicht mehr durch.
    Aber wie gesagt, danke Euch beiden. und einen schönen Sonntag abend noch...
     
  11. #10 Xanti, 29.10.2006
    Zuletzt bearbeitet: 29.10.2006
    Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Code:
    sed -e 's!^\([^ ]*\) \(.*\)$!\1 \2 \1!'
    
    Das Ganze ist nicht so schwierig. Es sieht nur kompliziert aus.

    sed -e 'befehl' ... Wende befehl auf den durch die Pipe geleiteten Stream an.

    s!suchmuster!ersetzung! ... substitute-Befehl: suche nach suchmuster und ersetze es durch ersetzung.

    ^ ... Matche Anfang der Zeile.

    \(...\) ... Alles, was zwischen den Klammern gematcht wird, wird in den Variablen \1 \2 ... gespeichert, \1 für die erste Klammer, \2 für die zweite Klammer ...

    [...] ... Bezeichnet eine Klasse zu erkennender Zeichen, [^...] negiert diese.

    * ... bezeichnet eine beliebige (0-...) Anzahl des vorhergehenden Zeichens/Klasse.

    $ ... Matche Ende der Zeile.

    Mehr dazu auch unter man sed.

    Gruss, Xanti
     
  12. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  13. #11 flappinski, 29.10.2006
    flappinski

    flappinski Foren As

    Dabei seit:
    31.03.2006
    Beiträge:
    87
    Zustimmungen:
    0
    danke schoen für diese erklärung, mich haben am meisten die ! statt / irritiert, dadurch konnte ich mich gar nciht zurech finden, und mit sed habe ich bisher nur einfache Ersetzungen gemacht und keine Variablenspeicherungen.
    Viel Spass noch und vielen Dank,
    Stephan
     
  14. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Es ist relativ egal, welches Zeichen man für die Substitution benutzt. sed weiss, dass das erste Zeichen nach s das Trennungszeichen ist.

    Gruss, Xanti
     
Thema:

auch ich mit sortieren

Die Seite wird geladen...

auch ich mit sortieren - Ähnliche Themen

  1. Bräuchte Hilfe bei Backupscript mittels Bash und cronjob

    Bräuchte Hilfe bei Backupscript mittels Bash und cronjob: Es soll für bestimmte Ordner Archivierung aller Dateien(Logfiles), die älter als 30 Tage sind machen. Am besten einmal täglich nachts irgendwann....
  2. »Master Of Orion«-Remake auch für Linux

    »Master Of Orion«-Remake auch für Linux: Das kommende Remake des Spieleklassikers »Master Of Orion« ist seit dem Wochenende auch für Linux verfügbar. Das Spiel steht ab sofort als »Early...
  3. »ARK: Survival Of The Fittest« auch für Linux

    »ARK: Survival Of The Fittest« auch für Linux: Das Entwicklerstudio Wildcard hat der Spin-Off für »Ark: Survival Evolved« über den Steam Early Access nun auch allen Linux- und Mac OS X-Nutzern...
  4. Microsoft SQL Server künftig auch unter Linux

    Microsoft SQL Server künftig auch unter Linux: Nachdem Microsoft im letzten Monat die Unterstützung von RHEL in seiner Azure-Plattform ankündigte, hat der Hersteller nun die künftige...
  5. Speedport W 921 V auch von außen angreifbar?

    Speedport W 921 V auch von außen angreifbar?: Der Router ist dafür bekannt das er über WPS angreifbar ist. In alter Firmware ist ein WPS Standart pin Verdrahtet. Jetzt habe ich hier zwei...