Konsole - awk - Frage

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Konsole - awk - Frage

Beitrag von fabske » 19.04.2006 08:34:09

Hallo. Ich habe eine lange Textdatei und benötige alle Wörter in denen der String "xy" vorkommt, OHNE doppelnennung.
Wie kann ich das realisieren?
Vielen Dank
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 19.04.2006 08:40:51

verschoben von "Standardprog., Off. & Co"

Gruß Savar


PS: Wenn du sie schon "doppelt" rausbekommst, dann pipe sie einfach nach "sort" und dann nach "uniq"
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 19.04.2006 11:02:06

Hi,

folgendes awk-Script gibt dir alle Woerter aus die den String xy enthalten:

Code: Alles auswählen

nawk '
{
  for(wort=1;wort<=NF;wort++){
    if($wort ~ "xy")
      print "Gefunden, Zeile = " NR ", wort = "$wort
  }
}'
Wie Savar schon geschrieben hat kannst du "unique" bzw. "sort -u" verwenden, um aus diesem Output die Doubletten zu entfernen. Meine zusaetzlichen Ausgaben solltest du natuerlich entfernen, sonst wird's nix :wink:
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 19.04.2006 15:46:31

Rolis Script so angepasst, das jedes Wort nur einmal ausgegeben wird:

Code: Alles auswählen

nawk '
{
  for(wort=1;wort<=NF;wort++){
    if($wort ~ "xy")
      wordlist[$wort] = 42;
  }
}
END {
  for (w in wordlist) 
    print w;
}'  < DATEI
(Statt nawk geht natürlich auch gawk oder awk)

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 19.04.2006 16:28:17

Hi Joghurt,
Joghurt hat geschrieben:(Statt nawk geht natürlich auch gawk oder awk)
So pauschal wuerde ich das nicht unterschreiben. Ich sitze immer wieder vor Kisten (derzeit einem Solaris) bei denen awk ein Link ist, leider aber auf oawk.
Ich sitze dann jedesmal total perplex da wenn irgendwas nicht funktioniert, bis ich wieder daran denke, "schau doch mal nach" was du hier eigentlich benutzt.

<edit>Einen habe ich noch:
Welche Loesung ist eigentlich schneller? Aus dem Bauch heraus wuerde ich auf meine in Kombination mit uniq tippen, wobei das mit Sicherheit auch von der Groesse der Inputdatei abhaengt. Vielleicht kannst du mohameth da ja was zu sagen, bezogen auf dein Problem.
Awk ist ein Klasse Tool, keine Frage, ich nutze es auch sehr oft, aber was schneller koennt's doch sein</edit>
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Beitrag von fabske » 19.04.2006 18:16:14

Vielen Dank für die Lösungen! Einen Geschwindigkeitsunterschied konnte ich nicht feststellen, soo groß ist meine Datei dann auch wieder nicht.
Konkret ging es darum, ungewollte Ligaturen aus einem Tex-File herrauszufinden um sie dann zu unterdrücken.
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 19.04.2006 19:50:02

Hi,

wenn es sich nicht gerade um Giga/Megabyte handelt, und die Operation wie hier, doch recht simpel ist, ist der Unterschied wahrscheinlich relativ gering. Messen koenntest du das ganze z.B. indem du mal den Befehl "time" vor den awk-Aufruf von Joghurt, bzw. meine awk-uniq "Tool Chain" setzt. Wenn du jetzt noch die Dateigroesse, und den Output von "wc deine_Datei" hier Posten wuerdest, haette man mal einen Anhaltspunkt was schneller ist.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Beitrag von fabske » 19.04.2006 20:25:23

Code: Alles auswählen

fabske@uoi-01:/mnt/dateien.uoi-01/fabske$ wc DATEI
  738  3164 26416 DATEI
fabske@uoi-01:/mnt/dateien.uoi-01/fabske$ time ./roli
...
real    0m0.028s
user    0m0.004s
sys     0m0.005s
fabske@uoi-01:/mnt/dateien.uoi-01/fabske$ time ./jog
...
real    0m0.028s
user    0m0.006s
sys     0m0.002s
fabske@uoi-01:/mnt/dateien.uoi-01/fabske$                              
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 19.04.2006 22:17:31

roli hat geschrieben:Welche Loesung ist eigentlich schneller?
Das hängt davon ab, wie in der jeweiligen awk-Version die Arrays implementiert sind. Ob als Hashmap oder als Suchbaum etc. Ich würde spontan vermuten, dass es von der Anzahl der Treffer abhängt; schließlich muss bei deiner Lösung zum Schluss noch sortiert werden.

Und in der Tat. Ich hab mal beide auf die Bibel losgelassen, und einmal nach Wörtern, die ein "e" enthalten gesucht, und einmal nach "exxy" (wo es keine Treffer geben wird)

Code: Alles auswählen

$ wc -w bible
1072268 bible
$ # 'e' suchen, 31.428 Treffer
$ time ./jog.sh > /dev/null
real    0m1.615s
user    0m1.365s
sys     0m0.012s
$ time ./roli.sh > /dev/null
real    0m9.253s
user    0m8.947s
sys     0m0.042s
$ # 'exxy' suchen, 0 Treffer
$ time ./jog.sh > /dev/null
real    0m1.390s
user    0m1.141s
sys     0m0.009s
$ time ./roli.sh > /dev/null
real    0m1.390s
user    0m1.130s
sys     0m0.012s
Es hängt aber stark davon ab, was man eigentlich machen will, welche Awkversion man nutzt und ob man die Ergebnisse sortiert haben will.
(Und natürlich davon, ob man Mittwoch abens nichts besseres zu tun hat, als einen sinnlosen Benchmark zu machen)

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 20.04.2006 09:04:21

Wow, Danke ihr 2,

damit haette ich echt nicht gerechnet, ich bin immer davon ausgegangen, das awk die Bremse war, wenn grosse Shell-Scripte (mit awk drinnen), langsam liefen.
Wieder was dazugelernt :idea:
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Beitrag von fabske » 20.04.2006 11:44:25

Dann hat ja nun jeder was davon :D
Danke nochmal.
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

Antworten