Hallo, eine Frage zur Textbearbeitung: Ich habe eine Datei mit 6822 Zeilen. Darunter sind 392 Zeilen, die an die jeweils vorhergehende angehängt werden müssen. Es gibt 4 verschiedene eindeutige Strings. Die Zeilen die angehängt werden müssen, diese Strings nicht. Gibt es eine Möglichkeit mit grep und co. diese Aufgabe zu lösen: Wenn eine Zeile nicht einen der Strings enthält, dann hänge Sie an die vorhergehende Zeile an. Gued gohn Joachim
Joachim Tüns
eine Frage zur Textbearbeitung:
Ich habe eine Datei mit 6822 Zeilen. Darunter sind 392 Zeilen, die an die jeweils vorhergehende angehängt werden müssen.
Es gibt 4 verschiedene eindeutige Strings. Die Zeilen die angehängt werden müssen, diese Strings nicht.
Gibt es eine Möglichkeit mit grep und co. diese Aufgabe zu lösen: Wenn eine Zeile nicht einen der Strings enthält, dann hänge Sie an die vorhergehende Zeile an.
das kann man gut mit sed (kryptisch) oder besser mit awk oder perl machen. grep geht nicht. Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@[informatik-vollmer.de|alumni.uni-karlsruhe.de|acm.org] www.informatik-vollmer.de
Am Sonntag, 5. Oktober 2003 12:06 schrieb Dr. Jürgen Vollmer:
Joachim Tüns
eine Frage zur Textbearbeitung:
Ich habe eine Datei mit 6822 Zeilen. Darunter sind 392 Zeilen, die an die jeweils vorhergehende angehängt werden müssen.
Es gibt 4 verschiedene eindeutige Strings. Die Zeilen die angehängt werden müssen, diese Strings nicht.
Gibt es eine Möglichkeit mit grep und co. diese Aufgabe zu lösen: Wenn eine Zeile nicht einen der Strings enthält, dann hänge Sie an die vorhergehende Zeile an.
das kann man gut mit sed (kryptisch) oder besser mit awk oder perl machen. grep geht nicht.
Huch? Wieso denn nicht? <ungetestet> prev="" cat datei | while read ln; do dont_do_it=`echo $ln | grep "wort1\|wort2\|wort3\|wort4"` if test -n "$dont_do_it"; then test -n "$prev" && echo $prev prev="$ln" else echo "$prev$ln" prev="" fi done echo $prev </ungetestet> Da ich die Bedingungen (immer nur 1 Zeile anhängen, auch an Zeilen anhängen, die die Suchmuster enthalten?, ...) nicht genau kenne, sollte das nur als Muster gewertet werden. Jan
Hallo, Am Sun, 05 Oct 2003, Jan Trippler schrieb:
cat datei | while read ln; do dont_do_it=`echo $ln | grep "wort1\|wort2\|wort3\|wort4"` if test -n "$dont_do_it"; then
if echo "$ln" | grep -q 'wort1\|wort2\|wort3' then -dnh -- Das Wort "WINDOWS" stammt aus einem alten Sioux-Dialekt und bedeutet: "Weißer Mann starrt durch Glasscheibe auf Sanduhr."(gefunden in d.c.t)
Hallo Jan, hallo Leute, Am Sonntag, 5. Oktober 2003 23:07 schrieb Jan Trippler:
cat datei | while read ln; do [...] prev="$ln" [...] done echo $prev
</ungetestet> ^^^^^^^^^^ Glaub ich gern, das echo $prev ganz am Ende (nach dem done) dürfte nämlich genau gar nix ausgeben ;-) Grund: die ganze Schleife hängt hinter einer Pipe (-> Subshell), und nach dem done wird die Subshell beendet und der Wert von $prev geht mit ihr verloren.
Das Problem lässt sich aber recht einfach lösen ;-) Ich verleihe Dir (ausgerechnet Dir!) erstmal einen useless use of cat award damit Du auch mal einen bekommst. *SCNR* Sonst verteilst Du die ja immer nur ;-) Und schon sollte das Script funktionieren: while read ln; do # kein cat, keine Pipe, keine Subshell [...] prev="$ln" [...] done < datei # ^^^^^^^ echo $prev Gruß Christian Boltz PS: handverlesene sig ;-) --
Ist das sone Art wie cat sigdatei | grep suchstring? Oh nein - nicht schon wieder! Hilfeeee, Doktor! Ich sehe schon wieder so einen unnötigen cat ;-) [> Michael Raab und Jan Trippler in suse-linux]
Am Montag, 6. Oktober 2003 23:25 schrieb Christian Boltz:
Am Sonntag, 5. Oktober 2003 23:07 schrieb Jan Trippler:
cat datei | while read ln; do [...] prev="$ln" [...] done echo $prev
</ungetestet>
^^^^^^^^^^ Glaub ich gern, das echo $prev ganz am Ende (nach dem done) dürfte nämlich genau gar nix ausgeben ;-) Grund: die ganze Schleife hängt hinter einer Pipe (-> Subshell), und nach dem done wird die Subshell beendet und der Wert von $prev geht mit ihr verloren.
Hast Du Recht - ich habs einfach nur so runtergeklimpert und nicht zu Ende gedacht. Es gibt eben Tage (und Uhrzeiten ;), da sollte man die Pfoten von der Tastatur weglassen ;)
Das Problem lässt sich aber recht einfach lösen ;-)
Ich verleihe Dir (ausgerechnet Dir!) erstmal einen useless use of cat award damit Du auch mal einen bekommst. *SCNR* Sonst verteilst Du die ja immer nur ;-)
Danke - ich wollte endlich auch mal einen haben; Kommt in die Vitrine - auf handgeschöpftem Büttenpapier gedruckt ;-)
PS: handverlesene sig ;-)
--
Ist das sone Art wie cat sigdatei | grep suchstring? Oh nein - nicht schon wieder! Hilfeeee, Doktor! Ich sehe schon wieder so einen unnötigen cat ;-) [> Michael Raab und Jan Trippler in suse-linux]
Die Geister die man rief ... Jan
Joachim Tüns wrote:
Ich habe eine Datei mit 6822 Zeilen. Darunter sind 392 Zeilen, die an die jeweils vorhergehende angehängt werden müssen.
Es gibt 4 verschiedene eindeutige Strings. Die Zeilen die angehängt werden müssen, diese Strings nicht.
Gibt es eine Möglichkeit mit grep und co. diese Aufgabe zu lösen: Wenn eine Zeile nicht einen der Strings enthält, dann hänge Sie an die vorhergehende Zeile an.
Mit grep und co (sed) wirst Du das nur schwer hinbekommen. Eine perl-Lösung habe ich grad mal ausprobiert (Achtung, nur ein dirty-hack): daten: dies ist die erste Zeile und hier (123) die zweite Zeile dazu (456) noch eine dritte Zeile die vierte Zeile perl: perl -ne ' chomp; if (!/123|456/) { print "$z\n" if $z; undef $z; } $z .= $_; END { print "$z\n" if $z; } ' daten Zeilen, in denen 123 oder 456 vorkommt, werden an die vorherige angehängt. Gruss Jens
Hallo und vielen Dank, Am Sonntag Oktober 05 2003 09:21 schrieb Joachim Tüns:
eine Frage zur Textbearbeitung:
Ich habe eine Datei mit 6822 Zeilen. Darunter sind 392 Zeilen, die an die jeweils vorhergehende angehängt werden müssen. Es gibt 4 verschiedene eindeutige Strings. Die Zeilen die angehängt werden müssen, diese Strings nicht.
das Perl-Script von Jens habe ich weitgehende verstanden, jedenfalls so weit, dass ich es für mich anpassen kann. Für das Bash-Script von Jan mit den Erweiterungen und Kommentare hatte ich noch keine Zeit. Werde es mir aber zu Gemüte führen. Das ist alles recht neu für mich mit Perl- und Bash-Programmierung habe ich mich bislang noch nicht auseinander gesetzt. Meine VBA-Kenntnisse (berufliche lebe ich eine in einer Windows-Welt) sind recht passabel. Vielen Dank, die Scripten erlauben mit den Start in Perl und Bash-Programmierung. Gued gohn Achim
participants (6)
-
Christian Boltz
-
David Haller
-
Dr. Jürgen Vollmer
-
Jan.Trippler@t-online.de
-
Jens Tautenhahn
-
Joachim Tüns