sed/grep Anfängerproblem

J

jurgen_xf

Mitglied
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
 
Zuletzt bearbeitet:
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
 
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
 
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
das versuche ich ja, aber die erzeugten dateien sind leer
 
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

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
 
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
 
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
 
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

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
 
Aufeinanderfolgende Leerzeichen entfernen:
cat datei | tr -s " "

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

MFG
 
Aufeinanderfolgende Leerzeichen entfernen:
cat datei | tr -s " "

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

MFG

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
 
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.
 
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:



:D Gruss, A.
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
 
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.
 

Ähnliche Themen

Leerzeichen, Großbuchstaben, HTML Tags entfernen mittels SED

Suchen und Ersetzen mit SED

Last mit etc/passwd anzeigen lassen

Shell-Script zum auslesen von Dateien aus versch. Verzeichnissen

HP PSC 2175 - CUPS druckt nicht

Zurück
Oben