Suchphrasen erkennen und zuordnen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von L0rd, 13.02.2012.

  1. L0rd

    L0rd Mitglied

    Dabei seit:
    28.04.2006
    Beiträge:
    38
    Zustimmungen:
    0
    Hallo,

    es geht um ca. 40 festdefinierten Phrasen die erkannt werden müssen und entsprechend gekenzeichnet werden müssen. Dazu möchte ich mir eine mit ; getrennte Tabelle erstellen mit 40 Spalten also eins für jede Phrase und bei Treffer schreibe ich z.B.x in die entsprechende Spalte rein(die ohne Treffer bleiben leer).

    Also ich habe eine Datei woraus die Phrasen erkannt werde müssen, es sieht so aus (habe eine Phrase pro Zeile)

    Code:
    Phrase Nummer eins
    zweite Phrase
    dritte Phrase
    vierte Phrase
    habe mir überlegt diese datei zeilenweise auszulesen(for i in read datei ...) und jede Phrase in Variable zu speichern um es dann mit grep oder so zu identifizieren,
    aber wie unterscheide bzw. zuordne ich die Phrasen damit ich es in die Tabelle schreiben kann ?

    habe mal mit case probiert aber es scheint sich an Ausdrucken mit mehreren Wörtern zu stören :(
    mit "if" ist es auch nicht das ware 40 if-Abragen zu schreiben und die dann "abrattern" zu lassen(?).

    ich hätte dann natürlich auch noch 40 Variablen gebraucht und die dann so ausgegeben:
    Code:
    echo "$phrase1;$phrase2;$phrase3;$phrase4;$phrase.................." >> tabelle
    in meinem Beispiel hier musste die Tabelle dann so aussehen

    Code:
    x;x;x;x;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    bei einer Datei die so aussiht

    Code:
    zweite Phrase
    dritte Phrase
    sollte die Tabelle so aussehen

    Code:
    ;x;x;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    hat jemand eine Idee ?

    Vielen Dank !
     
  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. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.053
    Zustimmungen:
    8
    Mein erster Ansatz wäre ein Perl-Script, das über die Phrasen eine Hashtabelle aufbaut und diese dann entsprechend sortiert ausgibt.
     
  4. L0rd

    L0rd Mitglied

    Dabei seit:
    28.04.2006
    Beiträge:
    38
    Zustimmungen:
    0
    danke marce aber in diesen 2 Sachen habe ich noch wenniger Ahnung...

    habe mir was überlegt

    also ich habe 2 Dateien in einer stehen zeilenweise Referenz Phrasen(40 lines) und in anderen die einfach Phrasen(ca. 5 lines) die zugeordnet werden müssen. In keiner der zwei dateien kommt eine Phrase doppelt vor (eigentlich) :)

    Ich mache es umgekehrt - ich suche in Referenz und lasse mir die Zeilennummer von Treffer geben. Dann lasse ich ein "X" in das feld von array mit der Zeilennummer schreiben.
    Es muss dann nur noch Ausgegeben werden
    Code:
    for i in `cat phrasen`;
    do
    
    zeile=`grep -n "$i" referenz | cut -d: -f1`;
    
    area[$zeile]=X;
    
    done
    
    ausgabe aler Zellen von area mit ";"
    zurücksetzen von array
    
    und bei der Ausgabe ist es nicht so einfach die nicht gesetzten array Felder auszugeben vor allem mit ";"

    habe was gefunden was am ende immer ";" anheftet aber natürlich nicht bei leeren Feldern.
    Code:
    
    replacement() {
        echo -n ";"
    }
    
    echo ${area[@]/%e/$(replacement)}
    
    
    Für Tipps und Elegantere Lösungen des Problems wäre ich weiterhin sehr dankbar.

    Was ist eigentlich mit uniq ? kann man da auch Zeilennummer von Referenz Datei mit übereinstimmenden Zeilen ausgeben ? habe aber auch keine Ahnung wie ich dann die Zeilenummer in die "X" und ";" verwandeln soll
     
  5. #4 marcellus, 14.02.2012
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Wenn du 1:1 pattern hast kannst du dir mit "grep -n" die Zeilennummer von deiner Zeile mit phrasen rausgreifen, zb

    phrasen:
    Code:
    a
    b
    c
    Code:
    $ grep -n b phrasen 
    2:b
    damit kannst du dein switch machen, das ist aber nicht so einfach, wenn du tatsächlich regexp verwenden willst. Hast du vielleicht ein Beispiel?
     
  6. #5 HeadCrash, 14.02.2012
    HeadCrash

    HeadCrash Routinier

    Dabei seit:
    16.05.2009
    Beiträge:
    482
    Zustimmungen:
    1
    Ort:
    Bayern
    Moin

    Code:
    $ cat testfile
    Phrase Nummer eins
    zweite Phrase
    dritte Phrase
    vierte Phrase
    Phrase Nummer eins
    zweite Phrase
    dritte Phrase
    vierte Phrase
    Phrase Nummer eins
    zweite Phrase
    dritte Phrase
    vierte Phrase
    
    $ sort testfile | uniq -c
          3 dritte Phrase
          3 Phrase Nummer eins
          3 vierte Phrase
          3 zweite Phrase
    
    wäre dann zwar umsortiert, aber zumindest schon mal gezählt. Alternativ mit einer "richtigen" Skriptsprache an die Sache rangehen

    mfg
    HeadCrash
     
  7. L0rd

    L0rd Mitglied

    Dabei seit:
    28.04.2006
    Beiträge:
    38
    Zustimmungen:
    0
    Es geht nicht um Zählen(hab ja gesagt: "In keiner der zwei Dateien kommt eine Phrase doppelt vor" ), sondern um Zuordnen der Begrife/Phrasen in die richtigen Spalten der tabelle.

    also ein Beispiel:

    Datei referenz (enthält normalerweise 40 Zeilen, Übersichtshalber gekürzt)

    Code:
    High Definition Audio
    Standard ausgestattet
    Dokumentation der Hersteller
    Chip im Computer
    Spezifizierungen des Mainboards
    Anwendungen entwickeln
    Vorgaben zur Weitergabe
    Lizenz gebunden
    Prozessoren erzeugen
    Gruppen getestet
    Diagramm nicht gezeigt
    Ausnahmen bilden
    Funktionen bestimmt
    Starten von Kommandos
    Bedingungen und Schleifen
    Dateinamen-Wildcards
    Durchführung von Berechnungen
    Testen von Dateieigenschaften
    Starten von Prozessen
    Dateisystem gesucht
    Kommandos entgegennimmt
    User geschrieben
    Abschneiden von Zeilen
    Erweiterung dieser Shell
    
    Datei phrasen (kann 0 oder 1 bis 10 Zeilen groß sein)

    Code:
    Anwendungen entwickeln
    Vorgaben zur Weitergabe
    Spezifizierungen des Mainboards
    
    mein unfertiges Script

    Code:
    for i in `cat phrasen`;
    do
    
    zeile=`grep -n "$i" referenz | cut -d: -f1`;
    #hier wird Nummer der Zeile ermittelt und somit die Begrif identifiziert mit ner Nummer
    
    area[$zeile]=X;
    #hier wird entsprechendes Array Feld mit "X" beschrieben
    
    done
    
    #ausgabe aller Zellen von area[*] mit ";" getrennt in Datei tabelle
    #zurücksetzen von array
    
    wie schon gesagt an Ausgabe hackts bei mir

    Datei tabelle sollte dan so aussehen, gesamte Anzahl von ";" pro Zeile muss gleich der Anzahl von Zeilen der referenz-Datei sein. Jedes Feld entspricht einer Zeile der referenz-Datei.

    Code:
    ;;;;X;X;X;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    die Treffer stehen in Zeilen 5,6 und 7 von referenz, somit auch die "X" an diesen Stellen.
    Jede zeile aus referenz entspricht einer Spalte in meiner tabelle.
    Somit die Spalten 5,6 und 7 in tabelle stehen bei mir für Spezifizierungen des Mainboards, Anwendungen entwickeln und Vorgaben zur Weitergabe.

    nur so: Datei tabelle wird natürlich im laufe der Zeit mehr Zeilen haben.

    so, ich denke es müsste jetzt gut verständlich sein was ich hier Anstellen möchte :)
     
  8. #7 tgruene, 14.02.2012
    tgruene

    tgruene Routinier

    Dabei seit:
    02.02.2012
    Beiträge:
    418
    Zustimmungen:
    0
    Mit
    Code:
    grep -n -f phrasen referenz
    bekommst Du die Zeilen in "referenz" angezeigt, die in "phrasen" aufgelistet sind, zusammen mit der Zeilennummer:
    Code:
    grep -n -f phrasen referenz
    5:Spezifizierungen des Mainboards
    6:Anwendungen entwickeln
    7:Vorgaben zur Weitergabe
    
    Wenn Du die Ausgabe an 'cut' weitergibst, erhaeltst Du die Zeilennummern:
    Code:
    grep -n -f phrasen referenz | cut -f 1 -d ':'
    5
    6
    7
    
    Um das auszudrucken, kannst Du dann arrays benutzen:
    Code:
    zeilen=$(wc -l referenz | cut -f 1 -d ' ')
    for i in $(seq $zeilen); do output[$i]=";"; done
    vorkommen=$(grep -n -f phrasen referenz | cut -f 1 -d ':')
    for i in $vorkommen; do output[$i]="x;"; done
    echo ${output[@]}
    
    Wenn Dir die Leerzeichen in der letzen Zeile nicht gefallen, schau Dir das manual von 'tr' an!
     
  9. L0rd

    L0rd Mitglied

    Dabei seit:
    28.04.2006
    Beiträge:
    38
    Zustimmungen:
    0
    Interessanter Ansatz! Danke!

    Code:
    zeilen=$(wc -l referenz | cut -f 1 -d ' ')
    die Zeile kann man eigentlich sparen( kein Vorwurf ), weil referenz hat fest 40 Zeilen, egal...

    Code:
    for i in $(seq $zeilen); do output[$i]=";"; done
    wollte auch so lösen, aber insgeheim habe ich gehofft, dass vielleicht jemand einen Trick hervorzaubert womit die 40 Felder von Arry gleich/auf einem Rutsch mit ";" beschrieben werden können (also ohne Schleife) :)

    Code:
    vorkommen=$(grep -n -f phrasen referenz | cut -f 1 -d ':')
    diese Idee mit grep finde ich sehr gut.
    Wird es auch funktionieren wenn ich phrasen als eine Variable nehme ? (wegen Perfomance)

    Code:
    for i in $vorkommen; do output[$i]="x;"; done
    echo ${output[@]}
    das problem mit leeren Zeile hate ich irgendwo schon gesehen,
    es wurde so gelöst

    Code:
    echo ${output[*]}
    und damit das feld [0] nicht ausgegeben wird, sondern die ausgabe gleich mit Feld 1 beginnt
    musste es glaube ich so sein

    Code:
    echo ${output[*]:1}
    ich werde es noch alles in Praxis testen und berichten
     
  10. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  11. L0rd

    L0rd Mitglied

    Dabei seit:
    28.04.2006
    Beiträge:
    38
    Zustimmungen:
    0
    Hallo,

    hab getestet und es funktioniert ! Danke nochmal ! Aber wenn jemand vielleicht noch Verbesserungsvorschläge hat, dann bitte.
    übrigens kriege so ein Ergebnis
    Code:
    ; ; ; ;X;X;X; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
    also mit Leerstellen, weiss jemand wieso ? Es ist net schlimm nur es vergrössert unnötig die Grösse der Datei :(
     
  12. #10 tgruene, 14.02.2012
    tgruene

    tgruene Routinier

    Dabei seit:
    02.02.2012
    Beiträge:
    418
    Zustimmungen:
    0
    Vielleicht, weil 'echo' leerzeichen einbaut? "tr -d ' '" am Ende koennte die loeschen.
     
Thema:

Suchphrasen erkennen und zuordnen

Die Seite wird geladen...

Suchphrasen erkennen und zuordnen - Ähnliche Themen

  1. [Debian] USB-Festplatte automatisch erkennen

    [Debian] USB-Festplatte automatisch erkennen: Hallo, ich habe ein Problem mit einer USB-Festplatte an meinem Debian-Server. Es handelt sich dabei um eine 3 TB USB 3.0-Festplatte (GPT)....
  2. cut Befehl Leerzeichen erkennen

    cut Befehl Leerzeichen erkennen: Hallo zusammen, ich habe eine Textdatei, die verschiedene Felder hat. Ich möchte beispielsweise ein Feld in der Zeile 1 Zeichen 10 - 20...
  3. Probleme beim Erkennen der Fritz-Box 2170

    Probleme beim Erkennen der Fritz-Box 2170: Probleme beim Erkennen der Fritz-Box 2170 [EDIT]: gelöst Hallo liebe Gemeinde, gestern habe ich eine Fritz-Box 2170 (ohne W-Lan) bekommen und...
  4. Netzwerkadapter automatisch erkennen

    Netzwerkadapter automatisch erkennen: Ich arbeite mit einer fixen Festplatte, welche ich an diverse Arbeitsstationen mitnehme, dort anschliesse und von dieser boote. Alle...
  5. Geräte in der Konsole erkennen

    Geräte in der Konsole erkennen: Hallo zusammen, bei Automount erscheinen unter Kanotix die Laufwerkssysmbole auf dem Desktop, wobei man zwischen den Speichermedian anhand der...