[linux] Re: awk helemaal gek geworden?
Daniel C. von Asmuth
asmuth op bakunin.xs4all.nl
Di Jan 5 22:28:37 CET 2016
Aldus schreef Hans Paijmans op Tue, Jan 05, 2016 at 09:50:40PM +0100:
> On 05/01/16 20:53, Daniel C. von Asmuth wrote:
> > Aldus schreef hans paijmans op Tue, Jan 05, 2016 at 03:39:03PM +0100:
> >> Ik dacht dat ik na dertig jaar alle rare streken van awk wel had gezien.
> >> Niet dus.
> >>
> >> Het volgende scriptje leest van een usb port, bewerkt de regels en
> >> schrijft ze weer weg.
> >> De regel die begint met 'for (a=0;a<=aantal;...' doet dat wegschrijven.
> >> Zoals het scriptje
> >> hier staat, met " >> filenaam" weggecommentarieerd, zet de data in de
> >> goede volgorde op het scherm. Als ik " >> filenaam" toevoeg, worden de
> >> regels IN OMGEKEERDE VOLGORDE naar filenaam geschreven.
> >>
> >> Veel krabben op het hoofd is het gevolg.
> >>
> >> awk '{
> >> if (substr($0,1,5)=="# Dat")
> >> {
> >> ident=substr($0,18);
> >> filenaam="log_"ident
> >> command="rm "filenaam
> >> system(command);
> >> }
> >> if (substr($0,1,5)!="# err") regel[aantal++]=$0;
> >> else
> >> {
> >> for (a=0;a<=aantal;a++) print regel[a]; # >> filenaam
> >> print "logdata geschreven naar "filenaam
> >> exit;
> >> }
> >>
> >> }' < $port
> > Dit vind ik een wat merkwaardig script; de uitvoer zal erg afhangen van
> > de invoer. Zo probeert het kennelijk naar $filenaam te schrijven wat
> > alleen werkt als die variabele een waarde heeft gekregen, maar het
> > deel dat die variabele zet, verwijdert dan weer $filenaam.
>
> Beste Daniel (en Paul), een script in awk wordt een keer uitgevoerd
> voor iedere inputregel.
> De regel waar de filenaam uit wordt berekend staat in het begin van de
> input (dat weet ik) en
> kan dus rustig een reeds bestaande file uitvegen.
>
> Verder weet ik dat een regel die begint met "# err" aan het einde van de
> input staat. De
> array regel[] wordt alleen weggeschreven als dat einde is gevonden,
> waarna het programma
> een exit doet. Een END{} blok zou eleganter zijn, maar de usb port
> stuurt geen ctrl-D.
>
> Intussen heb ik gevonden dat als de regels zowel naar stdout als naar de
> file worden geschreven
> de volgorde ook in de file correct is. Waarom hij achterstevoren staat
> als alleen naar de file wordt
> geschreven is nog steeds een raadsel.
Tjsa,
In de bovenstaande vorm werkt het script...
De voorgestelde wijziging is fout:
awk: cmd. line:12: for (a=0;a<=aantal;a++) print regel[a]; >> filenaam
awk: cmd. line:12: ^ syntax error
De volgende gaat beter:
for (a=0;a<=aantal;a++) print regel[a] >> filenaam ;
en de regels staan ook gewoon in de volgorde van invoer.
> > Voorstel (als de baas het goed vindt): wij morgen samen AWK scriptje
> saneren en
> > u overmorgen mij helpen met Powershell script op Windows :-)
>
> AIk wil best, maar ik weet ghelemaal niks van powershell.
Ik ook niet:-( Het Spoor heeft me ook maar ingehuurd als Bash scripter.
> --
> Dr. J.J. Paijmans
> Houwenberg 2A, 5985 PE Grashoek (L) 077 888 05 77
> http://paijmans.net GSM: +31 621 961 083
> v.a. Macbook
>
Met vriendelijke groet,
Daniel von Asmuth
--
More information about the Linux
mailing list