Doppelte Zeichen in einer Zeile löschen?

  • Hallo


    Giebts einen Befehl um auf 1 x "bla" zu kommen, sprich in einer Zeile doppelte Sachen löschen, nicht nur Zeilenweise?


    Code
    :~ # echo 1 1 1 | uniq
    bla bla bla
    :~ # echo -e "1\n1\n1" | uniq
    bla
    :~ # echo 1 1 1 | sort -u
    bla bla bla
    :~ # echo -e "1\n1\n1" | sort -u
    bla


    echo bla bla bla | ?
    bla


    MFG Ronny

  • also, auf die Schnelle faellt mir sowas ein: ein Skript unick

    Code
    #/bin/bash
    
    
    echo `echo $@ |sed -e 's/ /\n/g' | sort -u`


    und dann

    Code
    cat file |  xargs -l1 ./unick


    beachte, dass di Option -l1 bei mir notwendig ist, obwohl die man-page sagt, diese Option waere default. Die Ausgabe sieht dann so aus:


    Code
    # cat bla
    1 1 1 2 2 3 1 98
    6 6 7 8 8 bla bla foo bla
    # cat bla | xargs -l1 ./unick
    1 2 3 98
    6 7 8 bla foo


    Das ist dann sozusagen "Zeilenweise Säuberung"
    wenn es dir wurscht ist, ob du alle Zeilen oder Spalten oder was "säubern" willst,
    dann kannst du auch einfach des machen:

    Code
    # cat bla | sed -e 's/ /\n/g' | sort -u
    1
    2
    3
    6
    7
    8
    98
    bla
    foo


    dann geht allerdings die Information verloren, welche strings aus welchen Zeilen kommen. Wenn es dir aber egal ist, dann ist es sicherlich einfacher

  • Danke, letzeres langt vollkommen.


    Auch gerade von einem User nen Schnipsel erhalten:


    Code
    sed -r -e "s/^([^ ]+)[ ]+(\1[ ]*)+/\1/g"


    MFG Ronny

  • Zitat

    Original von anonymous
    Danke, letzeres langt vollkommen.


    Auch gerade von einem User nen Schnipsel erhalten:


    Code
    sed -r -e "s/^([^ ]+)[ ]+(\1[ ]*)+/\1/g"


    MFG Ronny


    das funktioniert aber nur, wenn die Zeile bereits sortiert ist, d.h. nur wenn die
    wiederholungen unmittelbar hintereinander sind:

    Code
    # echo bla foo bla | sed -r -e "s/^([^ ]+)[ ]+(\1[ ]*)+/\1/g"
    bla foo bla


    und es fehlt ein Leerzeichen:

    Code
    # echo bla bla foo bla | sed -r -e "s/^([^ ]+)[ ]+(\1[ ]*)+/\1/g"
    blafoo bla
    # echo bla bla foo bla | sed -r -e "s/^([^ ]+)[ ]+(\1[ ]*)+/\1 /g"
    bla foo bla
  • das funktioniert aber nur, wenn die Zeile bereits sortiert ist, d.h. nur wenn die
    wiederholungen unmittelbar hintereinander sind:


    Dann passt es nicht, es soll sortiert sein, benötige den Index der Plugins die "real" von VDR geladen worden sind:


    Code
    ./vdr -V | awk '{ print $1 }'´
    prefermenu
    games
    dvd
    mp3
    lcdproc
    calendar
    mplayer
    streamdev
    remote


    Dabei ist mir aufgefallen, das einiege doppelte Einträge erzeugen (bei einer version vom analog tv plugin, und glaube xinelibout ebenfalls), sollte halt sortiert sein und dopplungen entfallen, oder sollte man einfach den index aus ../PLUGINS/lib besorgen?


    Das scheint aber nicht der Weg zu sein, habe es mal probiert, eine VDR Version von Anno, und Plugins, es wurden Libs erzeugt, vdr -V hat sie mir nicht angezeigt, aber funktioniert haben sie nicht.


    MFG Ronny

  • ich hatte gemeint, dass dieses nur funktioniert, wenn innerhalb der Zeilen bereits sortiert ist:


    Zitat

    Original von anonymous
    Auch gerade von einem User nen Schnipsel erhalten:


    Code
    sed -r -e "s/^([^ ]+)[ ]+(\1[ ]*)+/\1/g"


    was ich dir vorhin geschickt habe, geht:

    Code
    sed -e 's/ /\n/g' | sort -u

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!