Mapping a value in BASH

From XPUB & Lens-Based wiki
Revision as of 11:12, 17 April 2014 by Michael Murtaugh (talk | contribs) (for christoph / lafkon)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

A typical operation with (re)processing data for visualisation or other manipulation is the translation of some value (number) from one context to another. (In math terms you call this a mapping from a domain to a range.) In the BASH this can be tricky as maths are limited to being integer only -- so trying to work with a value like 0.5 won't work. In the example shown, the value 100 is used to multiply the input value to get a bit more precision. A higher value could be used for more precision (like 1000, 1000000). If this number is too big though (depending on the input / output numbers) you could get into trouble.

# map some value from inlo to inhi to a new range: outlow, outhi
function map {
  i=$1
  inlo=$2
  inhi=$3
  outlo=$4
  outhi=$5
  p=$(( (i*100) / (inhi-inlo) ))
  o=$(( outlo + (p * (outhi-outlo) / 100) ))
  echo $o
}

out=`map 50 0 100 5000 10000`
echo out $out