#!/bin/sh
## summe [-t] [-2] [-v]
##
## addiert alle Zahlen aus dem Clipboard, der Standardeingabe (Pipe) oder aus "$*",
## je nach Zweck. Gut fuer Gimp-Stundenzettel oder um Spalten zu rechnen.
##
# 01.09.2012
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
. inc
TMP0=$SRC/tmp/summe0.tmp
TMP1=$SRC/tmp/summe1.tmp
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## [-v] zeigt die Rechnung (verbal).
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VERBAL=`echo $* | grep '\-v'`
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## [-t] hilft, Zeiten im Stundenzettel zusammenzurechnen.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TIMES=`echo $* | grep '\-t'`
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## [-2] gibt die zu rechnende Spalte an (Trenner ist Tab).
## das geht via Pipe oder aus der fluechtigen Zwischenablage.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
COLUMN=`echo $* | sed 's|-v||g' | egrep '^ *-[[:digit:]]+ *$' | sed 's|^.*-\([[:digit:]]\+\).*$|\1|g'`
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## [1 2 -3] wird einfach addiert.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VALUES=`echo $* | sed 's|-[A-Za-z]\+||g'`
## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## ohne Option ("verbal" ausgenommen) wird aus der fluechtigen Zwischenablage
## gelesen, Text wird vorher entfernt.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if [ -z "$VALUES" -a -z "$TIMES" -a -z "$COLUMN" ] ; then VALUES=`xsel -p` ; fi
#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#///// S P A L T E N A D D I E R E N /////////////////////////////////////////////////
#=========================================================================================
if [ -n "$COLUMN" ] ; then
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Teste auf Werteübergabe per Pipe.
# Das geht nach langem Suchen auf diese Weise, siehe:
# http://forum.linux-club.de/viewtopic.php?f=91&t=120294
# Alternative zum read: tty bzw. tty -s und dann den Return-Code checken
# read -t 0.1 TEST (geht nicht, wenn die Datei mit einer Leerzeile beginnt)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TEST=`tty | grep 'not a tty'`
if [ -n "$TEST" ] ; then
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Wurde etwas per Pipe übergeben:
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VAL=` awk 'BEGIN { FS = "\t" }
{ print $'$COLUMN' }' |\
\
egrep '^ *-?[[:digit:]]+(\.[[:digit:]]{2})?$'`
NUM=` echo $VAL | sed 's| \+|+|g' | sed 's|+-|-|g'`
else
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Wurde nicht etwas per Pipe übergeben, probiere die Zwischenablage:
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VAL=` xsel -p |\
\
awk 'BEGIN { FS = "\t" }
{ print $'$COLUMN' }' |\
\
egrep '^ *-?[[:digit:]]+(\.[[:digit:]]{2})?$'`
NUM=` echo $VAL | sed 's| \+|+|g' | sed 's|+-|-|g'`
fi
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Rechnung und Ergebnis ausgeben:
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ERG=`echo 'scale=2; '$NUM | bc`
if [ -n "$VERBAL" ] ; then echo -n ' '$NUM' =' ; fi
echo -e $hellrot $ERG $def
echo $ERG | xsel -b -i
exit 0
fi
#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#///// S T U N D E N Z E T T E L : Z E I T E N A D D I E R E N /////////////////////
#=========================================================================================
if [ -n "$TIMES" ] ; then
xsel -p > $TMP0
echo -n '' > $TMP1
line=0 # aktuelle Zeile
lines=`wc -l $TMP0 | sed 's| .*$||g'` # Anzahl der Zeilen
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Damit auch Leerzeilen berücksichtigt werden, jede Zeile einzeln:
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
while [ $line -le $lines ] ; do
line=`expr $line + 1` # hochzählen
row=`sed -n $line'p' $TMP0` # Zeile auslesen
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Zeilen mit Zeitangaben
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if [ -n "$row" ] ; then
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Eine Zeitangabe ist z.B. "7.45 10.30":
#
# Ersetze viertel, halbe, dreiviertel Stunden nach dezimal
# Vertausche die beiden Zeiten (um abziehen zu können),
# und füge ein '-' ein.
#
# "$NUM" ist der String, mit dem 'bc' rechnen wird.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NUM=`echo $row | sed 's|\.15|.25|g' | sed 's|\.30|.5|g' | sed 's|\.45|.75|g' |\
\
sed 's|^\([^ ]\+\) \(.*\)$|\2-\1|g'`
# Ergebnis rechnen, formatieren und ausgeben:
echo 'scale=2; '$NUM | bc |\
\
sed 's|0\+$||g' | sed 's|^\.|0.|g' | sed 's|\.$||g' | tr '.' ',' \
\
>> $TMP1
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Leerzeilen
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else
echo $row >> $TMP1
fi
done
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Das Ergebnis kommt in die echte Zwischenablage ("clipboard")
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cat $TMP1 | xsel -b -i
echo 'Ergebnis ist im Clipboard'
exit 0
fi
#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#///// Z A H L E N A D D I E R E N ///////////////////////////////////////////////////
#=========================================================================================
if [ -n "$VALUES" ] ; then
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Anspruch ist, das ganze Blöcke incl. Labels und Daten (11.11.11) gerechnet werden.
# Folgende Ersetzungen werden vorgenommen:
#
# Zeilenumbrüche entfernen
# alles, was mehrere Punkte hat (z.B. Daten), entfernen
# Komma zu Punkt
# alles, was keine Ziffer und kein und kein Minus Punkt ist, zu Leerzeichen
# String trimmen
# Leerzeichen zwischen den Zahlen zu je einem "+"
# "+" und "-" = "-" für negative Zahlen, weil Minuszeichen auch an
# anderer Stelle (in Texten) vorkommen können, mehrfache entfernen
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NUM=`echo $VALUES |\
\
tr '\n' ' ' |\
sed 's|[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+||g' |\
tr ',' '.' |\
sed 's|[^-.[:digit:]]| |g' |\
sed 's|^[[:space:]]*||g' |\
sed 's|[[:space:]]*$||g' |\
sed 's|[[:space:]]\+|+|g' |\
sed 's|+-|-|g' | sed 's|--\+|-|g'`
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Rechnung und Ergebnis ausgeben:
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ERG=`echo 'scale=2; '$NUM | bc`
if [ -n "$VERBAL" ] ; then echo -n ' '$NUM' =' ; fi
echo -e $hellrot $ERG $def
echo $ERG | xsel -b -i
exit 0
fi
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@FIN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@