Suchphrasen erkennen und zuordnen

L

L0rd

Mitglied
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 !
 
Mein erster Ansatz wäre ein Perl-Script, das über die Phrasen eine Hashtabelle aufbaut und diese dann entsprechend sortiert ausgibt.
 
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
 
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?
 
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
 
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 :)
 
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!
 
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
 
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 :(
 
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 :(

Vielleicht, weil 'echo' leerzeichen einbaut? "tr -d ' '" am Ende koennte die loeschen.
 

Ähnliche Themen

Probleme mit Skript (zum Sichern von Dateien)

Sicherheitslücken im Xorg

wer kann mir anhand eines beispiels mein problem lösen

Server-Monitoring mit RRDTool

Zurück
Oben