Skip to content

Instantly share code, notes, and snippets.

@Findus23
Last active August 29, 2015 14:01
Show Gist options
  • Save Findus23/d1187031f875b76a69e8 to your computer and use it in GitHub Desktop.
Save Findus23/d1187031f875b76a69e8 to your computer and use it in GitHub Desktop.
Umweltdatenmessung: erste Version
#!/bin/bash
# (c) by http://www.cs.waikato.ac.nz/~fracpete/programming/csv2gnuplot/
# This transforms a CSV file into a gnuplot file.
# use option '-h' to display a help screen for all options.
#
# FracPete
# the usage of this script
function usage()
{
echo
echo "usage: ${0##*/} [-i <file>] [-o <file>] [-g <file>] [-G <file>]"
echo " [-O <file>] [-d <delim>] [-t] [-x] [-a] [-l] [-T]"
echo " [-W <width> -H <height>]] [-F <x11|png|ps>]"
echo " [-b <files>] [-e]"
echo " [-h]"
echo
echo "Transforms a given CSV file into a gnuplot input file. It can also"
echo "produce a gnuplot script for plotting the data, as well as batch"
echo "processing of several files with automatic output generation."
echo
echo " -h this help"
echo " -i <file>"
echo " the CSV file to use as input"
echo " -o <file>"
echo " the gnuplot output file, output to stdout if not provided"
echo " -g <file>"
echo " generates a gnuplot script with this name to display the data"
echo " it assumes that the first column is the index for the x-axis."
echo " In combination with '-b' this parameter is only used to indicate"
echo " that a script is wanted, the filename itself is ignored."
echo " -G <file>"
echo " a file containing gnuplot options, comments etc. to be added "
echo " before the plots"
echo " -O <file>"
echo " generates a script that outputs the plot in the format specified"
echo " with '-F' in a file with the given name, instead of displaying "
echo " it in a window"
echo " -d <delim>"
echo " the delimiter that separates the columns, default: $DELIMITER"
echo " -t transposes the matrix first"
echo " -x adds a column for the x-axis (numbers starting from 1)"
echo " -a generates the average of the columns"
echo " -l adds 'with lines' to the gnuplot script"
echo " -T adds a number as title to the gnuplot script"
echo " -F <x11|png|ps>"
echo " the format of the output, default: $FORMAT"
echo " -W <width>"
echo " the width of the output (if '-F png'), default: $WIDTH"
echo " -H <height>"
echo " the height of the output (if '-F png'), default: $HEIGHT"
echo " -b <files>"
echo " processes the given files in batch mode, i.e. '-i' and '-o' are"
echo " not necessary. the files get new extensions automatically."
echo " Note: use \" if you're using wildcards like '*'"
echo " -e generates the desired output files directly, i.e. in creates a"
echo " temp. gnuplot file and runs this (in combination with '-b',"
echo " otherwise '-g' must be given). "
echo " Works only if format is ps or png ('-F')."
echo
}
# variables
INPUT=""
OUTPUT=""
OUTPUT_PLOT=""
GNUPLOT=""
GNUPLOT_OPTIONS=""
HAS_OUTPUT="no"
HAS_GNUPLOT="no"
DELIMITER=","
TRANSPOSE="no"
XAXIS="no"
AVERAGE="no"
LINES="no"
TITLE="no"
FORMAT="x11"
WIDTH="800"
HEIGHT="600"
BATCH_FILES=""
BATCH_OPTIONS=""
EXECUTE="no"
# interprete parameters
while getopts ":hi:o:g:d:txalTF:W:H:O:b:eG:" flag
do
case $flag in
i) INPUT=$OPTARG
;;
o) OUTPUT=$OPTARG
HAS_OUTPUT="yes"
;;
g) GNUPLOT=$OPTARG
HAS_GNUPLOT="yes"
;;
G) GNUPLOT_OPTIONS=$OPTARG
BATCH_OPTIONS="$BATCH_OPTIONS -$flag $OPTARG"
;;
d) DELIMITER=$OPTARG
;;
t) TRANSPOSE="yes"
BATCH_OPTIONS="$BATCH_OPTIONS -$flag"
;;
x) XAXIS="yes"
BATCH_OPTIONS="$BATCH_OPTIONS -$flag"
;;
a) AVERAGE="yes"
BATCH_OPTIONS="$BATCH_OPTIONS -$flag"
;;
l) LINES="yes"
BATCH_OPTIONS="$BATCH_OPTIONS -$flag"
;;
T) TITLE="yes"
BATCH_OPTIONS="$BATCH_OPTIONS -$flag"
;;
O) OUTPUT_PLOT=$OPTARG
;;
W) WIDTH=$OPTARG
BATCH_OPTIONS="$BATCH_OPTIONS -$flag $OPTARG"
;;
H) HEIGHT=$OPTARG
BATCH_OPTIONS="$BATCH_OPTIONS -$flag $OPTARG"
;;
F) FORMAT=$OPTARG
BATCH_OPTIONS="$BATCH_OPTIONS -$flag $OPTARG"
;;
b) BATCH_FILES=$OPTARG
;;
e) EXECUTE="yes"
BATCH_OPTIONS="$BATCH_OPTIONS -$flag"
;;
h) usage
exit 0
;;
*) echo
echo "Unknown option: '-$OPTARG'"
echo
usage
exit 1
;;
esac
done
# valid combinations of parameters?
if [ ! "$BATCH_FILES" = "" ] && [ "$EXECUTE" = "yes" ] && [ "$FORMAT" = "x11" ]
then
echo
echo "ERROR: a format other than '$FORMAT' must be specified if '-b' and"
echo " '-e' are specified, e.g. 'ps'."
echo
usage
exit 2
fi
# batch-mode?
if [ ! "$BATCH_FILES" = "" ]
then
for i in $BATCH_FILES
do
echo "$i..."
# build options
OPTIONS=$BATCH_OPTIONS
OPTIONS="$OPTIONS -i $i"
OPTIONS="$OPTIONS -o $i.dat"
if [ "$HAS_GNUPLOT" = "yes" ]
then
OPTIONS="$OPTIONS -g $i.scr"
fi
if [ "$FORMAT" = "png" ]
then
OPTIONS="$OPTIONS -O $i.png"
fi
if [ "$FORMAT" = "ps" ]
then
OPTIONS="$OPTIONS -O $i.ps"
fi
# run script
$0 $OPTIONS
done
exit 0
fi
# test files
if [ ! "$INPUT" = "" ] && [ ! -f "$INPUT" ]
then
INPUT=""
fi
if [ ! "$GNUPLOT_OPTIONS" = "" ] && [ ! -f "$GNUPLOT_OPTIONS" ]
then
echo "Warning: '$GNUPLOT_OPTIONS' not found - ignored!"
GNUPLOT_OPTIONS=""
fi
if [ "$HAS_OUTPUT" = "no" ]
then
OUTPUT=$INPUT".tmp"
fi
# everything provided?
if [ "$INPUT" = "" ] || [ "$DELIMITER" = "" ]
then
echo
echo "ERROR: not all parameters provided or incorrect!"
echo
usage
exit 1
fi
if [ "$EXECUTE" = "yes" ] && [ "$HAS_GNUPLOT" = "no" ]
then
echo
echo "ERROR: '-g' must be specified with option '-e'!"
echo
usage
exit 3
fi
if [ "$OUTPUT_PLOT" = "" ] && [ ! "$FORMAT" = "x11" ]
then
echo "Warning: output file for format '$FORMAT' not specified, falling back to 'x11'"
FORMAT="x11"
fi
# some variables
TMPFILE=$OUTPUT".tmp"
# init
cp $INPUT $OUTPUT
# change modifier into " "
if [ ! "$DELIMITER" = " " ]
then
cat $OUTPUT | sed s/$DELIMITER/" "/g > $TMPFILE
cp $TMPFILE $OUTPUT
fi
# transpose matrix?
if [ "$TRANSPOSE" = "yes" ]
then
cat $OUTPUT | exec awk '
NR == 1 {
n = NF
for (i = 1; i <= NF; i++)
row[i] = $i
next
}
{
if (NF > n)
n = NF
for (i = 1; i <= NF; i++)
row[i] = row[i] " " $i
}
END {
for (i = 1; i <= n; i++)
print row[i]
}' > $TMPFILE
cp $TMPFILE $OUTPUT
fi
# average columns?
if [ "$AVERAGE" = "yes" ]
then
COLCOUNT=`head -n1 $OUTPUT | wc -w | sed s/" "*//g`
ROWCOUNT=`cat $OUTPUT | wc -l | sed s/" "*//g`
rm -f $TMPFILE
for ((i = 1; i <= $COLCOUNT; i++))
do
COL=`cat $OUTPUT | cut -f$i -d" "`
# average
TMP="("`echo $COL | sed s/" "/+/g`")/$ROWCOUNT"
if [ $i -gt 1 ]
then
echo -n " " >> $TMPFILE
fi
TMP=`echo "scale=4; $TMP" | bc -l`
echo -n $TMP >> $TMPFILE
# stddev
echo -n " " >> $TMPFILE
TMP="sqrt(($ROWCOUNT * ("`echo $COL | sed s/" "/"^2+"/g | sed s/$/"^2"/g`") - ("`echo $COL | sed s/" "/"+"/g`")^2) / ($ROWCOUNT * ($ROWCOUNT - 1)))"
TMP=`echo "scale=4; $TMP" | bc -l`
echo -n $TMP >> $TMPFILE
done
echo >> $TMPFILE
cp $TMPFILE $OUTPUT
fi
# add x-axis?
if [ "$XAXIS" = "yes" ]
then
cat $OUTPUT | grep -n "." | sed s/":"/" "/g > $TMPFILE
cp $TMPFILE $OUTPUT
fi
# gnuplot script?
if [ "$HAS_GNUPLOT" = "yes" ]
then
# data columns
COUNT=`head -n1 $OUTPUT | wc -w | sed s/" "*//g`
# build output/format statement
TERM="set terminal X11"
OUT="set output"
if [ "$FORMAT" = "png" ]
then
TERM="set terminal png size $WIDTH,$HEIGHT"
OUT="set output \"$OUTPUT_PLOT\""
fi
if [ "$FORMAT" = "ps" ]
then
TERM="set terminal postscript"
OUT="set output \"$OUTPUT_PLOT\""
fi
# build "with" statement
TMP=""
WITH=""
if [ "$LINES" = "yes" ]
then
TMP=$TMP" lines"
fi
if [ "$TITLE" = "yes" ]
then
TMP=$TMP" title #"
fi
if [ ! "$TMP" = "" ]
then
WITH=" with"$TMP
fi
# init
echo "# gnuplot script for '$OUTPUT'" > $GNUPLOT
if [ ! "$GNUPLOT_OPTIONS" = "" ]
then
cat $GNUPLOT_OPTIONS >> $GNUPLOT
fi
# the plots
echo "plot \"$OUTPUT\" using 1:2 `echo $WITH | sed s/"#"/"\'1\'"/g`" >> $GNUPLOT
for ((i = 2; i < $COUNT; i++))
do
echo "replot \"$OUTPUT\" using 1:$((i+1)) `echo $WITH | sed s/"#"/"\'$i\'"/g`" >> $GNUPLOT
done
echo >> $GNUPLOT
# only pause if displayed in window
if [ "$FORMAT" = "x11" ]
then
echo "pause -1" >> $GNUPLOT
else
echo "$TERM" >> $GNUPLOT
echo "$OUT" >> $GNUPLOT
echo "replot" >> $GNUPLOT
fi
# run gnuplot
if [ "$EXECUTE" = "yes" ]
then
if [ "$FORMAT" = "x11" ]
then
echo "Press <Return> to close window..."
fi
gnuplot "$GNUPLOT"
fi
fi
# clean up
rm -f $TMPFILE
if [ "$HAS_OUTPUT" = "no" ]
then
cat $OUTPUT
rm -f $OUTPUT
fi
# x-Achse enthält Zeitinformation
set xdata time
# Zeitformat zur Eingabe
set timefmt x "%H:%M:%S"
# Zeitformat zur Beschriftung der x-Achse
set format x "%H:%M:%S"
#!/bin/bash
#wert=$(cut -c 1,2,3,4 /proc/loadavg) # Load messen
wert=$(/opt/vc/bin/vcgencmd measure_temp | cut -c 6,7,8,9) #Betriebstemberatur messen
uhrzeit=$(date +%H:%M:%S) # +%H:%M:%S
ausgabe=${uhrzeit}\,${wert}
echo $ausgabe >>test.csv
#(tac test.csv; echo $ausgabe)|tac >test.csv
./csv2gnuplot.sh -i test.csv -F png -O test.png -e -g temp -l -G Einstellungen -W 1200 -H 800
# -i ... Input-Datei -F ... Output-Art -O ... Output-Datei
sudo cp test.png /var/www/cloud/test.png
# gnuplot script for 'test.csv.tmp'
# x-Achse enthält Zeitinformation
set xdata time
# Zeitformat zur Eingabe
set timefmt x "%H:%M:%S"
# Zeitformat zur Beschriftung der x-Achse
set format x "%H:%M:%S"
plot "test.csv.tmp" using 1:2 with lines
set terminal png size 1200,800
set output "test.png"
replot
15:55:24 51.9
15:55:27 51.9
15:55:30 51.9
15:56:18 51.9
data:image/png;base64,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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment