Anzeige:
Ergebnis 1 bis 9 von 9

Thema: SED-AWK-TR-Problem mehrere Zeilen zu einer

  1. #1
    Gentoo Avatar von s.fonsi
    Registriert seit
    Jul 2003
    Ort
    Schweiz
    Beiträge
    207

    SED-AWK-TR-Problem mehrere Zeilen zu einer

    Hi Leute meine Datei sieht so aus:
    Code:
    ANFANG
    00:45
    03:00
    Ich Glaub, Ich Liebe Meine Frau
    06:30
    08:15
    10:0011:45
    13:30
    15:15
    17:00
    18:45
    Wächter des Tages
    20:30
    22:45
    01:00
    03:15
    Ende
    Mit sed, awk oder tr muss ich das erreichen:
    Code:
    ANFANG
    00:45 03:00
    
    Ich Glaub, Ich Liebe Meine Frau
    06:30 08:15 10:00 11:45 13:30 15:15 17:00 18:45
    
    Wächter des Tages
    20:30 22:45 01:00 03:15
    
    Ende
    Ich möchte einfach alle Zeitangaben zwischen den Titeln zu einer Zeile Zusammenfassen. Die Zeitangaben und Zeilen warieren immer.
    Vielen Dank für eure Hilfe

  2. #2
    Registrierter Benutzer
    Registriert seit
    Jan 2008
    Beiträge
    2.551
    Code:
    sed -e :a -e '$!N;s/\n[0-9]/ /;ta' -e 'P;D'  file.txt | sed 's/[0-9]/\n&/'
    Verbesserungsvorschläge / Vereinfachungen willkommen ...

  3. #3
    r e t u r n s
    Registriert seit
    May 2004
    Ort
    Balmora
    Beiträge
    192
    mal fix zusammengehackt:
    Code:
    $ <data sed '/^[^0-9]/{s/^/\n/}' | awk '/^[^0-9]/{ print ; while (getline && $0 !~ /^$/) { printf $0 " " } ; if (!/^Ende$/) printf("\n\n")}'
    (Die kaputte Zeile wird nicht korrigiert.)
    Yeah, GNU's bigger than Linux!

    "M$" ist nur Neid!

  4. #4
    r e t u r n s
    Registriert seit
    May 2004
    Ort
    Balmora
    Beiträge
    192
    Zitat Zitat von Aqualung Beitrag anzeigen
    Code:
    sed -e :a -e '$!N;s/\n[0-9]/ /;ta' -e 'P;D'  file.txt | sed 's/[0-9]/\n&/'
    Verbesserungsvorschläge / Vereinfachungen willkommen ...
    Das erste Zeichen jeder Zeitenzeile wird verschlluckt, und die Newlines vor den Namen fehlen.

    ... ich bin mit meiner Lösung aber auch noch nicht zufrieden.
    Yeah, GNU's bigger than Linux!

    "M$" ist nur Neid!

  5. #5
    Gentoo Avatar von s.fonsi
    Registriert seit
    Jul 2003
    Ort
    Schweiz
    Beiträge
    207

    wow.

    Zitat Zitat von Meillo Beitrag anzeigen
    mal fix zusammengehackt:
    Code:
    $ <data sed '/^[^0-9]/{s/^/\n/}' | awk '/^[^0-9]/{ print ; while (getline && $0 !~ /^$/) { printf $0 " " } ; if (!/^Ende$/) printf("\n\n")}'
    (Die kaputte Zeile wird nicht korrigiert.)
    WOW. Das ging aber schnell. Mit "Kaputte Zeile" meinst die Uhrzeiten Zusammen?

  6. #6
    r e t u r n s
    Registriert seit
    May 2004
    Ort
    Balmora
    Beiträge
    192
    Zitat Zitat von s.fonsi Beitrag anzeigen
    Mit "Kaputte Zeile" meinst die Uhrzeiten Zusammen?
    ja.

    Hier noch eine bessere Lösung
    Code:
    $ <data awk '{ if (/^[^0-9]/) { if (NR != 1) {printf("\n\n")} print } else { printf($0 " ") } }'
    Yeah, GNU's bigger than Linux!

    "M$" ist nur Neid!

  7. #7
    Gentoo Avatar von s.fonsi
    Registriert seit
    Jul 2003
    Ort
    Schweiz
    Beiträge
    207
    Zitat Zitat von Meillo Beitrag anzeigen
    ja.
    Hier noch eine bessere Lösung
    Vielen Dank. Vielleicht Könnte man im Voraus bei alle Uhrzeitenzeilen mit sed so verändern, dass nach dem 4. Zeichen einen Abstand rein gemachet und erst dann dein Superscript?

    Wenn ich hier beendet ist, verspreche ich Linuxforen ca. 50€ zu spenden.
    So gut wie hier, wird nirgends
    Gruss
    s.fonsi

  8. #8
    Gentoo Avatar von s.fonsi
    Registriert seit
    Jul 2003
    Ort
    Schweiz
    Beiträge
    207
    So. Ich glaube so lasse ich es. Habe es mit Hilfe im IRC erweitert.

    Code:
    sed 's/^\([0-9]....\)/\1 /' | sed 's/[ \t]*$//' | awk '{ if (/^[^0-9]/) { if (NR != 1) {printf("\n\n")} print } else { printf($0 " ") } }'
    Erst werden nach dem 4. Zeichen Abstände eingesetzt, dann überflüssige Schlussabstände wieder gelöscht und dann script von Meillo.

    Habe Netzmeister schon angeschrieben. Vielen Dank Leute
    Gruss s.fonsi

  9. #9
    r e t u r n s
    Registriert seit
    May 2004
    Ort
    Balmora
    Beiträge
    192
    Zitat Zitat von s.fonsi Beitrag anzeigen
    Code:
    sed 's/^\([0-9]....\)/\1 /' | sed 's/[ \t]*$//' | awk '{ if (/^[^0-9]/) { if (NR != 1) {printf("\n\n")} print } else { printf($0 " ") } }'
    Erst werden nach dem 4. Zeichen Abstände eingesetzt, dann überflüssige Schlussabstände wieder gelöscht und dann script von Meillo.
    Im ersten SED solltest du noch ein 'g' an das 's'-Kommando anhängen, damit es auch funktioniert, falls mehr als zwei Zeiten in einer Linie stehen.
    Oder vermutlich treffender das verwenden:
    Code:
    sed 's/\([0-9][0-9]:[0-9][0-9]\)/\1 /g'


    ... hab gerne geholfen :-)
    Ich find es auch schön, dass du das Forum nun unterstützst!
    Yeah, GNU's bigger than Linux!

    "M$" ist nur Neid!

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 01.02.07, 12:45
  2. blood2 installer
    Von kingron im Forum Emulatoren für Spiele
    Antworten: 10
    Letzter Beitrag: 15.07.06, 07:29
  3. ORF Schi Challence
    Von himoz im Forum Spielen Allgemein
    Antworten: 10
    Letzter Beitrag: 13.01.06, 22:15
  4. qmail compilierungsprob
    Von compfreek im Forum Linux als Server
    Antworten: 2
    Letzter Beitrag: 25.03.03, 06:17
  5. 'for'-Schleifen Problem (bash/shell)
    Von fratzi im Forum Linux Allgemein
    Antworten: 2
    Letzter Beitrag: 02.02.03, 13:25

Lesezeichen

Berechtigungen

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