March 26, 2010

Aargh.. can't figure this out: for( i in s), index

Following is a script file snippet which is intended to replace a keyword with another string, which contains a numeric (line #) index into a key word file of following form:

keyword;replacetext
...
keyword_n;replacetext_n

It parses all *.htm files in a directory, parses and creates equivalent *.htp files. Parsing and replacement works fine.
#!/bin/sh

INEXT="htm"
OUTEXT="htp"
...
ParseKeys()
{
# $1 = KeyWordFile
find . \( ! -name . -prune \) -type f -name "*.$INEXT" | while read FILE
do
awk 'BEGIN{ FS=";"}
FNR==NR{ s[$1]=$2; next }
{
def=0;
for( i in s ) {
system("echo hello alldef: " def " i: " i " >>trash.txt")
if( $0 ~ i ){
system("echo hello def: " def " >>trash.txt")
system("echo hello i: " i " >>trash.txt")
system("echo hello s[i]: " s[i] " >>trash.txt")
gsub(i,s[i])
}
def=def+1;
}
print $0
}' $1 $FILE > temp
# $FILE is form ./*.htm
outfile=`echo "$FILE" | cut -f2 -d "/" | cut -f1 -d "."`
echo "$outfile"
mv -f temp $outfile.$OUTEXT
done
echo hello
}

The problem is that my line counter (def) for the keyfile is out of sync with the keyword (iterator - i) from "for( i in s )"

I get output like:

hello alldef: 0 i: blue_pill

which should be:

hello alldef: 32 i: blue_pill

since blue_pill is on the 32nd line.

does the "for( i in s )" not start iterating at first line, or am I seriously missing something? Is there a better way to do this?

Thanks for looking...

Bill

Click Here!