Anzeige:
Ergebnis 1 bis 14 von 14

Thema: Zeilenergänzung mit sed aus Variable

  1. #1
    Registrierter Benutzer
    Registriert seit
    Mar 2020
    Beiträge
    7

    Red face Zeilenergänzung mit sed aus Variable

    Hallo Leute.

    Ich bin neu hier und möchte erstmal herzlich grüßen.

    Ich bin Neueinsteiger in Linux und habe eine Fortbildung für Linux besucht. Ich war sehr begeistert und habe mir sofort ein Ubuntu installiert. Viele Sachen, die ich für meine Arbeit benötige lassen sich viel einfacher und vor allem sehr viel schneller erledigen. Tolle Sache.

    Jetzt bin ich an einem Problem hängen geblieben: Ich habe eine Tabelle in der verschiedene Werte stehen. Die habe ich in eine txt exportiert. Jetzt möchte ich anhand einer gesonderten Liste, die ich ebenfalls in eine txt geschrieben habe Suchbegriffe ich der Tabelle finden und bei einem Treffer eine neue Spalte aufmachen, die am Zeilenende der ersten txt den Suchbegriff aus der Liste anhängt.

    Ich habe jetzt zwei Tage aufgebracht und überall recherchiert. Dazu konnte ich nichts finden. Könnt ihr mir helfen?

    Meine Idee war mit

    Code:
    Suchbegriff=/home/user/Suchbegriff.txt |  sed "${Suchbegriff}" 'a/$/ ${Suchbegriff}/' /home/user/Tabelle.txt
    ans Zeilenende anzuhängen. Funktioniert aber nicht
    Geändert von Snickers (24.03.20 um 13:40 Uhr)

  2. #2
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.067
    Das ist eine Sache des quotings doubleticks statt single ticks und wenn man sicher sein muss, dass Slashes kein Problem machen, dann verwendet man andere delimiter, wie in meinem Beispiel eben pipes. Hier ein Beispiel fuer Variablen in sed

    Code:
    ttt=fooo 
    echo "bar" | sed "s|$|\ ${ttt}|g" bar fooo
    Und ein Beispiel fuer dein Problem, nicht sehr performant, aber im ersten Gang sollte es machen was du brauchst

    Code:
    ## Schleife mit Suchbegriffen 
    while read xx; do      
      ## Schleife mit Zeilen der Zieldatei     
      while read line; do       
    
       ## Wenn Treffer, dann setze Suchbegriff ans Ende der Datei       
        if [ $(grep $xx $line) -gt 0 ]; then         
          echo $line | sed "s|$|\ ${xx}|g" > output.txt       
        else          
          echo $line >> output.txt       
        fi      
    
      done < Tabelle.txt 
    done < Suchbegriff.txt
    Idee gestohlen von https://askubuntu.com/questions/7680...-a-sed-command
    Geändert von Huhn Hur Tu (26.03.20 um 10:18 Uhr)
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  3. #3
    Registrierter Benutzer
    Registriert seit
    Mar 2020
    Beiträge
    7
    Hallo Huhn Hur Tu.
    Danke für Deine Antwort. Wie setze ich die Schleife im Terminal um, per Script oder kann ich das so ins Terminal eintippen?
    Ist wahrscheinlich eine Dumme Frage, aber ich stehe noch am Anfang. Verzeihung!

    Update: Ich habe es mit einem Script laufen lassen. Bekomme aber dauernd Fehlermeldungen. Kann das an Sonderzeichen liegen?

    Beispiel: "grep: was: Datei oder Verzeichnis nicht gefunden"

    und muss es nicht " >> output.txt" heißen? Hier wird doch sonst nur die letzte Zeile geschrieben, oder?
    Geändert von Snickers (25.03.20 um 09:16 Uhr)

  4. #4
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.067
    Es ist auf jeden Fall sinnvoll, das Skript in einen File zu packen, aber es spricht auch nichts dagegen, das ganze einfach in die Konsole zu pasten, ausser der gute Geschmack.
    "grep: was: Datei oder Verzeichnis nicht gefunden", die Pfade musst du anpassen, ja die Umleitung mit anghaengen ">>" ist korrekt.
    Ich hab noch ein leerzeichen vor die Klammer "]" eingefuegt, sonst mag test nicht
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  5. #5
    Registrierter Benutzer
    Registriert seit
    Mar 2020
    Beiträge
    7
    Die Pfade hab ich natürlich angepasst. Er arbeitet auch und erstellt die output.txt.
    Das "was:" steht in der Tabelle. Ich denke, dass der ":" irgendwie interpretiert wird. Wie kann ich den auskommentieren bei der Suche mit grep, damit er nicht berücksichtigt wird?

    Außerdem ist mir aufgefallen, dass in der output.txt die Suchbegriffe aus dem Text gelöscht werden und nicht hinter der Zeile angehängt werden.
    Geändert von Snickers (25.03.20 um 10:39 Uhr)

  6. #6
    Registrierter Benutzer
    Registriert seit
    Mar 2020
    Beiträge
    7
    Hier mal zwei Ausgaben des Terminals:

    grep: message: Datei oder Verzeichnis nicht gefunden
    ./anfuegen.sh: 7: [: -gt: unexpected operator

    Das spricht doch dafür, dass der Doppelpunkt in sed interpretiert wird...

  7. #7
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.067
    Nochmal gefixt natuerlich -gt 0 anstatt -gt 1.

    Rufe das Script mal mit shabeng #!/bin/bash -x auf, dann siehst du eine dubug ausgabe
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  8. #8
    Registrierter Benutzer
    Registriert seit
    Mar 2020
    Beiträge
    7
    Das klappt immer noch nicht richtig. Jedenfalls werden jetzt nicht mehr die Suchbegriffe gelöscht.

    Code:
    #!/bin/bash -x
    while read xx; do      
      ## Schleife mit Zeilen der Zieldatei     
      while read line; do       
    
       ## Wenn Treffer, dann setze Suchbegriff ans Ende der Datei       
        if [ $(grep $xx $line) -gt 0 ]; then         
          echo $line | sed "s/$/\ ${xx}/g" >> /home/user/output.txt       
        else          
          echo $line >> /home/user/output.txt       
        fi      
    
      done < '/home/user/tabelle.txt'
    done < '/home/user/suchbegriffe.txt'
    Da zeigt er folgendes in der Debug-Ausgabe:

    Code:
    + '[' -gt 0 ']'
    ./ersetzen.sh: Zeile 7: [: -gt: Einstelliger (unärer) Operator erwartet.
    Geändert von Snickers (26.03.20 um 11:37 Uhr)

  9. #9
    Registrierter Benutzer
    Registriert seit
    Mar 2020
    Beiträge
    7
    Dann ist mir noch aufgefallen, dass die tabelle deutlich länger wird. Ursprünglich hat die tabelle 23000 Zeilen. Die output.txt hat 117000 Zeilen. Liegt das daran, dass das Skript mit dem Suchbegriff die ganze tabelle durchgeht, die Zeilen ohne Treffer in die output schreibt und mit dem nächsten Suchbegriff wieder die ganze Tabelle durchläuft und erneut die Zeilen ohne Treffer in die output schreibt?

    Ich hatte gedacht, dass das einfacher umzusetzen sei. Sorry.
    Geändert von Snickers (26.03.20 um 12:14 Uhr)

  10. #10
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.067
    Grr wennman es richtig macht kann es auch haesslich sein
    Code:
    #!/bin/bash -x
    while read xx; do      
      ## Schleife mit Zeilen der Zieldatei     
      while read line; do       
    
       ## Wenn Treffer, dann setze Suchbegriff ans Ende der Datei       
        if [ $(grep $xx $line | wc -l ) -gt 0 ]; then         
          echo $line | sed "s/$/\ ${xx}/g" >> /home/user/output.txt       
        else          
          echo $line >> /home/user/output.txt       
        fi      
    
      done < '/home/user/tabelle.txt'
    done < '/home/user/suchbegriffe.txt'
    
    cat output.txt | sort -u > out2.txt
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  11. #11
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    21.417
    Code:
        if [ $(grep $xx $line | wc -l ) -gt 0 ]; then
    sollte da anstatt des herumgepipens nicht einfach der Rückgabewert von grep reichen?
    sprich
    Code:
        if grep $xx $line ; then
    -> hab was gefunden -> ok -> mach das eine
    -> hab nix gefunden -> nicht oko -> mach das andere?

    (alternativ grep $xx $line && ( echo ... ) || ( echo ...) aus dem Kopf heraus...
    Ich bin root - ich darf das.

  12. #12
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.067
    Jetzt fuehle ich mich richtig schmutzig wegen meinem gebastele
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  13. #13
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    21.417
    keine Panik... Ich dachte ja nur... Vor allem, weil String-Rückgaben in Verbindung mit arithmetischen Vergleichen in der Bash immer ein Quell ewiger Freude sind (vor allem, wenn man dann noch quoten will / muss / ... damit "" ja def. vorhanden ist, falls mal aus irgendeinem Grund eben nichts zurückommt...
    Ich bin root - ich darf das.

  14. #14
    Registrierter Benutzer
    Registriert seit
    Mar 2020
    Beiträge
    7
    Das hat alles nicht funktioniert. Ich bin dann umgeschwenkt und habe versucht es anders zu lösen. Folgendes hast funktioniert, war allerdings extrem langsam:

    Code:
    #!/bin/bash
    while read line; do
        if [ "$(echo "$line" | grep -ic -f /home/user/hilfsliste.txt)" == 0 ]; then         
          echo "$line" >> /home/user/output.txt   
        elif [ "$(echo "$line" | grep -ic -f /home/user/hilfsliste.txt)" != 0 ]; then
    	while read xx; do
    	  if [ "$(echo "$line" | grep -ic "$xx")" != 0 ]; then
                echo "$line $xx" >> /home/user/output.txt;
              fi
    	done < /home/user/suchbegriffe.txt
        else
    	echo "$line" >> /home/user/output.txt
        fi
    done < /home/user/tabelle
    Das ist wahrscheinlich umständlch, aber als Anfänger bin ich doch etwas stolz, dass es überhaupt funktioniert hat. Vielleicht kann das ja noch jemand verfeinern und schneller machen. Meine Tabelle hat 27.000 Zeilen und es sind 3.000 Suchbegriffe.
    Die hilfsliste habe ich mir angelegt, damit nicht mit jeder Zeile 3.000 Begriffe abgeglichen werden. In der hilfsliste sind 4 Begriffe hinterlegt, was eine Vorauswahl darstellen soll. Erst wenn einer der Hilfsbegriffe vorhanden ist, kann auch eins der Suchbegriffe aus der großen Liste zutreffen.

Ähnliche Themen

  1. Variable in for schleife?
    Von xJAMESx im Forum Anwendungen Allgemein, Software
    Antworten: 15
    Letzter Beitrag: 25.08.11, 07:37
  2. PS1 Variable + SuSe 10.0
    Von Cerox im Forum System installieren und konfigurieren
    Antworten: 5
    Letzter Beitrag: 04.12.05, 12:46
  3. PHP Self Variable nicht da
    Von thilly01 im Forum Linux als Server
    Antworten: 1
    Letzter Beitrag: 09.11.05, 13:06
  4. export VARIABLE in Shell <> export VARIABLE in Skript????
    Von ThorstenHirsch im Forum Linux Allgemein
    Antworten: 8
    Letzter Beitrag: 13.06.03, 20:53
  5. Dataset in Variable
    Von thilly im Forum Linux Allgemein
    Antworten: 4
    Letzter Beitrag: 21.05.03, 14:47

Stichworte

Lesezeichen

Berechtigungen

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