sed/grep Anfängerproblem

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von jurgen_xf, 03.02.2011.

  1. #1 jurgen_xf, 03.02.2011
    Zuletzt bearbeitet: 03.02.2011
    jurgen_xf

    jurgen_xf Mitglied

    Dabei seit:
    19.10.2010
    Beiträge:
    29
    Zustimmungen:
    0
    Hallo,
    ich bearbeite ein Datei. In der ersten Spalte steht das Datum und danach folgen Werte. Nun möchte durch die Datei gehen,die Zeilen von "heute" und "gestern" rausholen, auf 2 neue Dateien aufsplitten und alle Leerzeichen durch ein Tab ersetzen. "heute" und "gestern" ist durch ein anderes Script definiert. In der neuen Datei soll das Datum (in der Originaldatei auch durch ein Leerzeichen getrennt: "2011 02 03 12 45" wie folgt auftauchen:2011/02/03 12:45:00)
    Der Ansatz:


    Code:
    for dateiname in 11111 22222
    grep "^$dateiname" *.txt | /usr/bin/sed -e 's/ /	/g' > $Verzeichnis\/$dateiname\/$dateiname\_$gestern.txt
    grep "^$dateiname" *.txt | /usr/bin/sed -e 's/ /        /g' > $Verzeichnis\/$dateiname\/$dateiname\_$heute.txt
    done
    

    Ich möchte nun irgendwie die Daten aus der Datei nach "heute" und "gestern" aufsplitten. Hat jemand ne Idee?

    Besten Dank
    Jurgen
     
  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. zst

    zst Foren As

    Dabei seit:
    06.09.2006
    Beiträge:
    95
    Zustimmungen:
    0
    Hallo jurgen,

    irgendwie ist nicht klar, was Du wirklich willst.
    Zuerst würde ich aus den Originaldateien die Tagesdateien erstellen. Diese kannst Du dann beliebig mit sed bearbeiten. Dabei zuerst das Datum richtig setzen, danach die TABs einfügen.
    Das Format für das Datum wäre:
    date +"%Y %m %d %H %M"

    Gruß zst
     
  4. #3 Remidemi, 04.02.2011
    Remidemi

    Remidemi Routinier

    Dabei seit:
    17.03.2008
    Beiträge:
    352
    Zustimmungen:
    0
    Ort:
    Südpfalz
    Hallo

    Also wenn du einfach Zeilen aus einer Datei extrahieren willst mach doch:
    grep heute $datei > heute.txt
    grep gersten $datei > gestern.txt

    Dann hast du deine heute und gestern Zeilen.

    MFG
     
  5. #4 jurgen_xf, 04.02.2011
    jurgen_xf

    jurgen_xf Mitglied

    Dabei seit:
    19.10.2010
    Beiträge:
    29
    Zustimmungen:
    0
    das versuche ich ja, aber die erzeugten dateien sind leer
     
  6. #5 jurgen_xf, 04.02.2011
    jurgen_xf

    jurgen_xf Mitglied

    Dabei seit:
    19.10.2010
    Beiträge:
    29
    Zustimmungen:
    0
    ok, hier ein beispiel der eingangsdaten und wie es aussehen soll:
    Code:
    input file:Filename: 111
    
    2011 02 03 17 00 220 11.3    6.4   9     993.3   5.4     
    2011 02 03 16 00 250 11.8    6.4   9     994.6   7.7    
    2011 02 02 20 00 240 10.8    4.0   7     994.5   9.4      
    2011 02 02 19 00 240 12.4    4.2   7     994.6   9.1      
    2011 02 02 18 00 240 11.8    3.8   7     994.4   9.9      
    
    output:Filename:111_20110203
    
    2011/02/03 17:00:00    220    11.3    6.4    9    993.3    5.4     
    2011/02/03 16:00:00    250    11.8    6.4    9    994.6    7.7     
    
    
    ouput2:filename:111_20110202
    2011/02/02 20:00:00    240    10.8    4.0    7    994.5    9.4       
    2011/02/02 19:00:00    240    12.4    4.2    7    994.6    9.1         
    2011/02/02 18:00:00    240    11.8    3.8    7    994.4    9.9
    
    
    gruß Jurgen
     
  7. zst

    zst Foren As

    Dabei seit:
    06.09.2006
    Beiträge:
    95
    Zustimmungen:
    0
    Hallo jurgen,

    hier ein Ansatz für Dich.
    Getestet auf Opensuse.

    Gruß zst

    Code:
    #!/bin/bash                                                                                                                                                                                                                                
    HEUTE=$(date +"%Y %m %d")
    GESTERN=$(date -d "-1 day" +"%Y %m %d")
    DATEINAME=111
    grep "$HEUTE" $DATEINAME | sed -e 's/ /\//' -e 's/ /\//' -e 's/ /:/2' >$DATEINAME.heute
    
     
  8. #7 Remidemi, 04.02.2011
    Remidemi

    Remidemi Routinier

    Dabei seit:
    17.03.2008
    Beiträge:
    352
    Zustimmungen:
    0
    Ort:
    Südpfalz
    Also wenn du das Tagesdatum weißt kannst du mit dem Script die Zeilen von "heute" (03) und "gestern" (02) extrahieren.

    while read var
    do

    if [ `echo $var | cut -d " " -f 3` -eq 03 ]
    then
    echo $var >> heute
    elif [ `echo $var | cut -d " " -f 3` -eq 02 ]
    then
    echo $var >> gestern
    fi

    done < dateiname
     
  9. #8 jurgen_xf, 04.02.2011
    jurgen_xf

    jurgen_xf Mitglied

    Dabei seit:
    19.10.2010
    Beiträge:
    29
    Zustimmungen:
    0
    Vielen Dank für die Hilfe. Das funktioniert mit dem Datum. Nun möchte ich noch die Leerzeichen in Tabs umwandeln. Manchmal habe ich 1 LZ zwischen den Spalten, manchma 2 oder 3 oder mehr und irgendwie haut es mir die Formatierung immmer auseinander.

    Gruß Jurgen
     
  10. #9 Remidemi, 04.02.2011
    Remidemi

    Remidemi Routinier

    Dabei seit:
    17.03.2008
    Beiträge:
    352
    Zustimmungen:
    0
    Ort:
    Südpfalz
    Aufeinanderfolgende Leerzeichen entfernen:
    cat datei | tr -s " "

    Leerzeichen in Tabs umwanden
    unexpand datei
    (Achtung Ausgabe nach stdout)

    MFG
     
  11. #10 jurgen_xf, 04.02.2011
    jurgen_xf

    jurgen_xf Mitglied

    Dabei seit:
    19.10.2010
    Beiträge:
    29
    Zustimmungen:
    0
    ich hab versucht das folgend noch hinter den code zu klatschen aber es werden keine lz in tabs ersetzt

    Code:
    grep "$HEUTE" $DATEINAME | sed -e 's/ /\//' -e 's/ /\//' -e 's/ /:/2' [COLOR="red"]-e 's/ {*}/ /g'[/COLOR]>$DATEINAME.heute
    

    gruß jurgen
     
  12. #11 floyd62, 04.02.2011
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Noch ein Ansatz: Mit ein paar Hilfsvariablen, die man vorher entsprechend besetzt, lässt sich das Ganze auch mit sed alleine lösen; dann braucht man die Eingabedatei auch nur einmal einzulesen:

    Code:
    #!/bin/sh
    
    
    IN=111
    
    DAY0="2011 02 03"       # $(date '+%Y %m %d')
    DAY1="2011 02 02"       # $(date -d '1 day ago' '+%Y %m %d')
    
    
    DATE0=$(echo "$DAY0" | tr " " "/") D0=$(echo "$DAY0" | tr -d " ")
    DATE1=$(echo "$DAY1" | tr " " "/") D1=$(echo "$DAY1" | tr -d " ")
    
    
    sed -n \
            -e 's/  */\t/5g' \
            -e "s,^$DAY0 \(..\) \(..\),$DATE0 \1:\2:00,w ${IN}_$D0" \
            -e "s,^$DAY1 \(..\) \(..\),$DATE1 \1:\2:00,w ${IN}_$D1" \
            <$IN
    
    ... scheint sogar zu funktionieren:
    Code:
    $ head 111*
    ==> 111 <==
    2011 02 03 17 00 220 11.3    6.4   9     993.3   5.4
    2011 02 03 16 00 250 11.8    6.4   9     994.6   7.7
    2011 02 02 20 00 240 10.8    4.0   7     994.5   9.4
    2011 02 02 19 00 240 12.4    4.2   7     994.6   9.1
    2011 02 02 18 00 240 11.8    3.8   7     994.4   9.9
    
    ==> 111_20110202 <==
    2011/02/02 20:00:00     240     10.8    4.0     7       994.5   9.4
    2011/02/02 19:00:00     240     12.4    4.2     7       994.6   9.1
    2011/02/02 18:00:00     240     11.8    3.8     7       994.4   9.9
    
    ==> 111_20110203 <==
    2011/02/03 17:00:00     220     11.3    6.4     9       993.3   5.4
    2011/02/03 16:00:00     250     11.8    6.4     9       994.6   7.7
    $
    
    :D Gruss, A.
     
  13. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  14. #12 jurgen_xf, 07.02.2011
    jurgen_xf

    jurgen_xf Mitglied

    Dabei seit:
    19.10.2010
    Beiträge:
    29
    Zustimmungen:
    0
    vielen dank...so in etwa hab ich es ja auch gemacht,- ich bekomme nur die Blanks nicht durch Tab ersetzt. Eigentlich kann das ja nicht so schwer sein,aber irgendwie sehe ich den fehler nicht
    Code:
      grep "^$gestern $station.txt  | sed -e 's/ /\//' -e 's/ /\//' -e 's/ /:/2'[COLOR="red"] -e's/ {*\}/ /g' [/COLOR]> GESTERN
    
     
  15. #13 floyd62, 07.02.2011
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Versuch doch einfach mal
    Code:
    -e 's/  */\t/2g'
    statt dem oben rot markierten Ausdruck; das sollte alle (ab dem 2.) Vorkommen von mindestens einem Leerzeichen durch jeweils einen Tab ersetzen, den Blank als Trenner zwischen Datum und Uhrzeit aber unverändert lassen.

    Gruss, A.
     
Thema:

sed/grep Anfängerproblem

Die Seite wird geladen...

sed/grep Anfängerproblem - Ähnliche Themen

  1. ausgabe formatieren mit sed/grep??

    ausgabe formatieren mit sed/grep??: hallo ich habe ein formatierungs problem ich lese von einem windowsserver die ip´s aus.. über ssh und wmic... ich habe 2 befehle um...
  2. Anfängerproblem: Wie programmiere ich C++ unter Linux

    Anfängerproblem: Wie programmiere ich C++ unter Linux: Ich bin noch ziemlich neu in Linux Sachen habe folgende Probleme: Ich habe voher schon mit WinXp bisl Programmiert mit Dev-C++ aber wie soll...
  3. qt Anfängerprobleme

    qt Anfängerprobleme: Hi, ich bin mal wieder dabei mich an qt herranzuwagen, doch ich bekomme es nicht hin. Ich will ein Stapellayout, in dem ich anstatt eines widgets...
  4. Sound (onBoard) in openSuSE 10 - Anfängerprobleme...

    Sound (onBoard) in openSuSE 10 - Anfängerprobleme...: Hallo, ich bin ein absoluter Linux-Einsteiger und habe auf einer Seite gelesen, dass SuSE für Anfänger relativ gut sei. Aus dem Grund habe ich...
  5. Einige Anfängerprobleme

    Einige Anfängerprobleme: Hallo zusammen Ich bin gestern Abend definitiv auf Linux umgestiegen, und hab nun Windows nur noch so als Notfallsystem drauf, wenn ich es mal...