[linux] Re: shell programmeervraagje

J. mailing-lists op xs4all.nl
Do mei 5 14:30:08 CEST 2005


On Thu, 5 May 2005, J. wrote:
> On Wed, 4 May 2005, Jeroen de Zwart wrote:
> > Hi,
> > 
> > ik probeer nu al even om via een script van een bestand de laatste 2 
> > regels te strippen en er vervolgens regels in te plakken en weer netjes 
> > de sluitregels toe te voegen.
<knip>
....
</knip> 
> #!/bin/bash
> 
> # De bestandsnaam
> filename=test.txt
> # Het totaal aantal regels
> lcount=`wc -l < ${filename}`
> 
> # lees regel voor regel
> while read LINE ; do
>  # een `regel' teller bij houden
>  i=$((i + 1))
>  # print de regel
>  echo ${LINE}
>  # als het regelnr. 2 regels voor het einde is dan...
>  if [ $i -eq $((lcount - 2)) ] ; then
>   echo foo
>   echo bar
>  fi
> done < ${filename}

Ik zie net dat ik vannacht wat te snel gereageerd heb. Hier is alsnog ook
de bash array versie.

#!/bin/bash

# De bestandsnaam
filename=test.txt
# IFS, field seperator, is normaliter:
# ``<space><tab><newline>''
previfs=$IFS
IFS='
'
# Nu is 't een <newline>, anders krijg je ieder woord
# apart in een element van de array

# laad het hele bestand in een `array'
array=($(cat "${filename}"))

# ${#array[@]} is het totaal aantal elementen in de array

# Voor ieder element..... [regels uit het bestand in dit geval]
for idx in $(seq 0 $((${#array[@]} - 1))) ; do
 echo ${array[${idx}]}
 # Het juiste punt bereikt ?
 if [ ${idx} -eq $((${#array[@]} - 3)) ] ; then
  echo foo
  echo bar
 fi
done

# NIET vergeten `IFS' te herstellen !!
IFS=$previfs

exit 0

Omdat je op een bepaald punt informatie wilt invoegen in het bestand zal
je moeten weten hoe groot het bestand is. De keuze m.b.v. bash is dan;
Of het gehele bestand in 1 keer in het geheugen lezen [bijv. array]
Of 2 * het bestand aanspreken..

Keuze hangt af hoe groot het bestand is, wat je aan systeem
bronnen hebt en in mindere mate hoeveel en wat voor een soort operaties je
wilt uitvoeren op de data.

Groet,

J.




More information about the Linux mailing list