Portál AbcLinuxu, 12. května 2025 06:31

Dotaz: sed - výběr řádků v souboru podle času

27.11.2007 22:50 pavel
sed - výběr řádků v souboru podle času
Přečteno: 584×
Odpovědět | Admin
Dobrý den, mám takovýto soubor:
xxx;xx;xxx;xxx;2007-03-28;10:20:05
xxx;xx;xxx;xxx;2007-03-28;16:20:05
xxx;xx;xxx;xxx;2007-03-28;21:20:05
xxx;xx;xxx;xxx;2007-03-28;23:20:05
xxx;xx;xxx;xxx;2007-03-29;00:20:05
xxx;xx;xxx;xxx;2007-03-29;06:20:05
xxx;xx;xxx;xxx;2007-03-29;11:20:05
xxx;xx;xxx;xxx;2007-03-29;14:20:05
xxx;xx;xxx;xxx;2007-03-29;20:20:05
xxx;xx;xxx;xxx;2007-03-30;10:20:05
------------
------------

Mám např. tyto proměnné:
Datum_start=2007-03-28
Hodina_start=18:02:10
Datum stop=2007-03-29
Hodina_stop=16:21:55
Potřeboval bych vypsat všechny řádky od Datum_start -Hodina_start do Datum stop - Hodina_stop. Umím vypsat řádky jen podle datumu:

sed -n "/$Datum_start/,/$Datum_stop/ p"

Zkoušel jsem:

sed -n "/$Datum_start [$Hodina_start]/,/$Datum_stop/ p", ale toto mi nefunguje. Nevím, jak přidat tu druhou proměnnou, aby to vypsalo řádky od $Hodina_start.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

27.11.2007 23:41 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Odpovědět | | Sbalit | Link | Blokovat | Admin
A proč zrovna sed? Přijde mi na to lepší awk
user@stroj:~$ awk -F\; '{if ($5>="2007-03-28" && $5<="2007-03-28") print $0}' test.txt
xxx;xx;xxx;xxx;2007-03-28;10:20:05
xxx;xx;xxx;xxx;2007-03-28;16:20:05
xxx;xx;xxx;xxx;2007-03-28;21:20:05
xxx;xx;xxx;xxx;2007-03-28;23:20:05
A podmínky si lze nakombinovat dle libosti..
28.11.2007 00:32 pavel
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Tak přesně toto v sedu umím, ale co s těmi hodinami?
28.11.2007 00:40 pavel
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Díky, už jsem to pochopil, stačilo jen přidat další podmínku za && ... Dobrou noc
28.11.2007 09:00 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Proč zrovna awk? Přijde mi na to lepší sed :)
sed -n "/$Datum_start;$Hodina_start/,/$Datum_stop;&Hodina_stop/p"
28.11.2007 09:01 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Překlep
sed -n "/$Datum_start;$Hodina_start/,/$Datum_stop;$Hodina_stop/p
"
28.11.2007 09:27 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Nemusíš se trefit do té správné startovací hodiny..
28.11.2007 10:07 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Pravda, nevšiml jsem si že ty hodiny nezná přesně.... (na pohled přesně vypadaly, asi jako počet obyvatel republiky:).
28.11.2007 11:47 pavel
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Tak jsem se unáhlil:

1. Takto to funguje:

user@stroj:~$ awk -F\; '{if ($5>="2007-03-28" && $5<="2007-03-28") print $0}' test.txt

2. Takto ne, nevezme to tu druhou proměnnou "Datum_stop". Neví někdo proč?

user@stroj:~$ awk -F\; '{if ($5>="$Datum_start" && $5<="$Datum_stop") print $0}' test.txt
28.11.2007 12:53 mlz
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Problem v expanzi ''

awk -F\ -v DSTART=$Datum_start -v DSTOP=$Datum_stop '{}' v awk budou promenne Datum_start mapovana na DSTART
28.11.2007 14:05 pavel
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Tak výběr podle datumu s proměnnými už funguje:
user@stroj:~$ awk -F\; -v datstart=$Datum_start -v datstop=$Datum_stop \
'{if ($5>=datstart && $5<=datstop) print $0}' test.txt
Neví někdo, jak tam ještě přidat ty hodiny?
28.11.2007 14:46 macrek | skóre: 12
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
napriklad takto:

awk -F\; -v datstart=$datum_start -v datstop=$datum_stop -v hodstart=$hodina_start -v hodstop=$hodina_stop '$5 == datstart && $6 == hodstart,$5 == datstop && $6 == hodstop{print}' sample.txt
An eye for an eye makes the whole world blind.
28.11.2007 16:12 pavel
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Mám např. tyto proměnné:
datum_start=2007-03-28
hodina_start=18:02:10
datum_stop=2007-03-29
hodina_stop=16:21:55
awk -F\; -v datstart=$datum_start -v datstop=$datum_stop -v hodstart=$hodina_start -v 

hodstop=$hodina_stop '$5 == datstart && $6 == hodstart,$5 == datstop && $6 == hodstop{print}' test.txt
Nezobrazí nic.
28.11.2007 16:33 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Bodejť ;-) Stačí se jen kouknout na podmínky.. "==" není totéž co ">=" nebo ">"
28.11.2007 20:08 macrek | skóre: 12
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
tak ako som to napisal, tak som to napisal :) tie podmienky su dobre, funguje to spravne:

user@neuron-ai ~ $ cat test.txt
1 xxx;xx;xxx;xxx;2007-03-28;10:20:05
2 xxx;xx;xxx;xxx;2007-03-28;16:20:05
3 xxx;xx;xxx;xxx;2007-03-28;21:20:05
4 xxx;xx;xxx;xxx;2007-03-28;23:20:05
5 xxx;xx;xxx;xxx;2007-03-29;00:20:05
6 xxx;xx;xxx;xxx;2007-03-29;06:20:05
7 xxx;xx;xxx;xxx;2007-03-29;11:20:05
8 xxx;xx;xxx;xxx;2007-03-29;14:20:05
9 xxx;xx;xxx;xxx;2007-03-29;20:20:05
10 xxx;xx;xxx;xxx;2007-03-30;10:20:05

user@neuron-ai ~ $ cat oddo
#!/bin/bash
datum_start=2007-03-28
hodina_start=21:20:05
datum_stop=2007-03-29
hodina_stop=20:20:05

awk -F\; -v datstart=$datum_start -v datstop=$datum_stop \
-v hodstart=$hodina_start -v hodstop=$hodina_stop '$5 == datstart && \
$6 == hodstart,$5 == datstop && $6 == hodstop{print}' test.txt

user@neuron-ai ~ $ ./oddo
3 xxx;xx;xxx;xxx;2007-03-28;21:20:05
4 xxx;xx;xxx;xxx;2007-03-28;23:20:05
5 xxx;xx;xxx;xxx;2007-03-29;00:20:05
6 xxx;xx;xxx;xxx;2007-03-29;06:20:05
7 xxx;xx;xxx;xxx;2007-03-29;11:20:05
8 xxx;xx;xxx;xxx;2007-03-29;14:20:05
9 xxx;xx;xxx;xxx;2007-03-29;20:20:05

Problem je v zle naplnenych premennych. Ak tvoj test.txt obsahuje to iste co moj, tak je jasne, ze ti to nepojde, pretoze sa nenajde dany cas (hodina_start).

"Program" samozrejme hlada presny vyskyt retazca. Teda datum/cas musi presne sediet s nejakym datumom/casom v test.txt.
An eye for an eye makes the whole world blind.
28.11.2007 20:30 pavel
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Toto také nefunguje:
awk -F\; -v datstart=$datum_start -v datstop=$datum_stop -v hodstart=$hodina_start -v 

hodstop=$hodina_stop '$5 >= datstart && $6 >= hodstart,$5 <= datstop && $6 <= hodstop{print}' test.txt
28.11.2007 22:48 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Bodejť by to taky fungovalo, když se ti z toho úplně vytratily podmínky. Koukni se na původní podobu toho příkladu.Dnes už je pozdě na to abych myslel, takže ti to nenapíšu.
28.11.2007 23:10 pavel
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Abych to zrekapituloval... Mám takovýto soubor test.txt:
xxx;xx;xxx;xxx;2007-03-28;10:20:05
xxx;xx;xxx;xxx;2007-03-28;16:20:05
xxx;xx;xxx;xxx;2007-03-28;21:20:05
xxx;xx;xxx;xxx;2007-03-28;23:20:05
xxx;xx;xxx;xxx;2007-03-29;00:20:05
xxx;xx;xxx;xxx;2007-03-29;06:20:05
xxx;xx;xxx;xxx;2007-03-29;11:20:05
xxx;xx;xxx;xxx;2007-03-29;14:20:05
xxx;xx;xxx;xxx;2007-03-29;20:20:05
xxx;xx;xxx;xxx;2007-03-30;10:20:05
------------
------------

Mám např. tyto proměnné:
Datum_start=2007-03-28
Hodina_start=18:02:10
Datum stop=2007-03-29
Hodina_stop=16:21:55
Chci vypsat řádky od Datum_start - Hodina_start do Datum stop - Hodina_stop. Problém je, že se Hodina_start a Hodina_stop nemusí přesně shodovat s údaji v souboru test.txt. Nakonec jsem přišel na toto řešení:
#prevede datum a cas v souboru test.txt (napr.2007-03-28;18:02:10)\
#na cislo (napr. 20070328180210) a ulozi do souboru test1.txt
cat test.txt|sed '/-/s///g;/:/s///g;/;/s///5'>test1.txt 

datumstart=2007-03-28
hodinastart=18:02:10
#vysledna promenna start bude mit format 20070328180210
start=$(echo $datumstart$hodinastart|sed '/-/s///g;/:/s///g;/;/s///5')


datumstop=2007-03-29
hodinastop=16:21:55
#vysledna promenna stop bude mit format 20070329162155
stop=$(echo $datumstop$hodinastop|sed '/-/s///g;/:/s///g;/;/s///5')

#vypise radky od 2007-03-28 16:20:05 do 2007-03-29 16:20:05
awk -F\; -v datstart=$start -v datstop=$stop\
 '{if ($5>=datstart && $5<=datstop) print $0}' test1.txt
Pokud se někomu nelíbí ten cat, tak je to proto, že mi to tyto stránky nechtěli vzít (nepovolený text test.txt). A jestli má někdo jednodušší řešení, sem s tím. By
29.11.2007 00:25 Pavel1 | skóre: 33
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
2 zjednodušení :

Pom.soub. test1.txt :
sed 's/[-:]//g;/;/s///5' test.txt > test1.txt
start (a podobně i stop) :
start=${datumstart//-/}${hodinastart//:/}
29.11.2007 00:30 Pavel1 | skóre: 33
Rozbalit Rozbalit vše Re: sed - výběr řádků v souboru podle času
Teda takto jsem to chtěl napsat :
sed 's/[-:]//g;s/;//5' test.txt > test1.txt

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.