Better Script
On 1 Nov 2006, Linux Journal Weekly Newsletter posted the following script.
THE BRAIN TRUST: READERS SHARE THEIR EXPERTISE
Thanks to Josmar in (I'm totally jealous) Paraná, Brazil for this tip:
Writing a CGI module entirely in BASH is a lot of fun. When, however, you
have to find something in a certain file and render just some of the fields
in an HTML table, this little trick always helps.
Lets say you have something like this expense report in a file named
"expenses.txt":
John, lunch, 3.50, Apr/01/2006
Karen, dinner, 8.00, May/30/2006
John, parking, 1.00, May/30/2006
Peter, dinner, 4.00, Apr/02/2006
Karen, lunch, 6.00, May/30/2006
And you need to render a HTML table for Karen's expenses, like this one:
Date Cost Description
May/30/2006 8.00 dinner
May/30/2006 6.00 lunch
Total Karen's expenses: 14.00
This script converts the "expenses.txt' file into the HTML you need to
produce the table above.
#!/bin/bash
PERSON="Karen"
grep -iF "$PERSON" expenses.txt | cut -f 2-4 -d , | tr -d ',' > /tmp/exp1.$$
if [ -s /tmp/exp1.$$ ]; then
TOTAL=0
echo "<table border=\"1\"><tr><th>Date</th><th>Cost</th><th>Description</th></tr>"
for I in `cat /tmp/exp1.$$ | tr ' ' '_' `; do
echo "$I" | tr '_' ' ' > /tmp/exp2.$$
read DESCR COST DATE < /tmp/exp2.$$
echo "<tr><td>$DATE</td><td>$COST</td><td>$DESCR</td></tr>"
TOTAL=`echo "$TOTAL+$COST" | bc`
done
echo "</table><p>Total $PERSON's expenses: $TOTAL</p>"
else
echo "No data for '$PERSON'"
fi
rm /tmp/exp1.$$ /tmp/exp2.$$
You can also use this script as a basic template for creating scipts to
convert CSV (comma separated values) files into HTML tables. Most databases
and spreadsheets can export data directly into CSV files.
Thanks to everyone for your tips! Please send more of them to share with our
community of readers! My email is jgray@ssc.com. We'll send you a free
t-shirt for your efforts (or a penguin chair for the best one)! Thanks!
I think there is a better solution to the problem. Below script was posted back to the editor. As you can see, it needs far less UNIX commands and there is no need to create temporary files.
#! /bin/sh
if [ $# -ne 1 ]; then
echo "Usage: $0 <name>"
exit 1
fi
awk -F"," '
BEGIN {
print "<table>"
print "<tr><td>Date</td><td>Cost</td><td>Description</td></tr>"
}
$1 == "'$1'" {
printf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n",$4,$3,$2)
}
END {
print "</table>"
}' expense.txt
Labels: awk, shell script, unix


0 Comments:
Post a Comment
<< Home