parsování souborů
Ing. Vlastimil Pospíchal
vpospichal na tiscali.cz
Úterý Duben 1 13:00:29 CEST 2003
On Tue, Apr 01, 2003 at 10:44:52AM +0200, Martin Proks wrote:
> >Potřeboval bych ze souboru vytáhnout nějaká data a nevím si s tím rady
> >3. najít řádek obsahující určitý řetězec a ze třetího řádku za ním přečíst
> >určitý údaj
>
> Zpusobu je milion: sed, perl, awk, ................
> Ja si asi nejlip rozumim s awk/gawk, takze:
>
> awk '{ if ( index($0, "co") != 0 ) {
> getline; getline; getline;
> print $0;
> # $0 cela radka, $1 prvni slovo, $2 druhe,...
> }
> }' "soubor"
Trochu mě zaráží, když z takových skvělých jazyků, jako je awk, perl
nebo python spousta programátorů udělá obyčejný procedurální jazyk.
Přitom při využití silných stránek těchto nástrojů bývají výsledné
skripty nejen kratší a čitelnější, ale také rychlejší.
Daleko srozumitelnější je podle mne využití přirozených vlastností awk:
awk '/retezec/ {getline;getline;getline;print}' soubor
Neříkám, že si s awk rozumím nejlépe, ale vždy se z nějakého jazyka
(zejména skriptovacího) snažím vyždímat maximum při minimální délce
zápisu, minimu cyklů a dobré srozumitelnosti.
Pro ilustraci přikládám skript, kterým filtruji maily ze sourceforge.net
pro rychlou orientaci (kompletní texty si samozřejmě nechávám také):
#!/bin/bash
/usr/bin/awk 'BEGIN {stav=0}
stav==0 && /^$/ {stav=1;print;next}
stav==0 && (/^From/||/^To/||/^Subject/) {print;next}
/http:\/\/sourceforge\.net/ {print line;print}
{line=$0}' |\
/usr/bin/formail
Kit
--
Ing. Vlastimil Pospíchal
http://www.hoteldrnholec.cz
Další informace o konferenci Talk