[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