#!/bin/bash
function MerkkijonostaMatriisiksi () { 
# Kun välieroitin ei ole välilyönti niin se täytyy laittaa kutsun kolmanneksi parametriksi. Kun välieroitin on jotakin muuta kuin välilyönti niin merkkijonossa saa olla välilyöntejä.
matriisinnimi=$1
unset matriisinnimi
[[ $3 ]] && IFS=$3
set -- $(echo "$2"); for (( n=1; n<=$#; n++ )); do eval $matriisinnimi[$n]='$(eval echo \${$n})' ; done
unset IFS
}   

function tulosta_matriisi () {
eval echo -e \${$1[@]} 
}
 
function tulosta_matriisi2 () {
function Tulosta_matriisin_rivi () { 
eval echo -e \${$1[@]} 
}
[[ $3 ]] && echo $3 || echo 'matriisin: '$1' tuloste:'
Sarakeluku=$2
Rivi=0
while true; do
  for (( n=0; n<=Sarakeluku-1; n++ )); do  
    [[ ! $(eval echo -e \${$1[n+$Sarakeluku*Rivi]}) ]] && Tulosta_matriisin_rivi xxxx && return
    xxxx=$xxxx" "$(eval echo -e \${$1[n+$Sarakeluku*Rivi]}) 
  done
  Tulosta_matriisin_rivi xxxxsana
  xxxx=''
  let Rivi++
done
}

function tulosta_matriisi3 () {
echo -n 'Matriisin jäsenten arvot     (tulosteessa on välilyönti jäsenten välissä): '; eval echo -e \${$1[*]\n}
echo -n 'Matriisin jäsenten osoitteet (tulosteessa on välilyönti jäsenten välissä): '; eval echo \${!$1[*]}
}

function kirjoita_assosiatiivinen_matriisi_levylle () { echo $(declare -p | grep "declare -A $1"  | cut -d= -f 2-) > /tmp/delme ;} # assosiatiivisen matriisin muistikuva RAM:missa talletetaan levylle.
#                                                                                                                                    tarvitsee "declare -A nimi" 

function kirjoita_tavallinen_matriisi_levylle () { echo $(declare -p | grep "declare -a $1"  | cut -d= -f 2-) > /tmp/delme ;} # assosiatiivisen matriisin muistikuva RAM:missa talletetaan levylle.

function tulosta_matriisi4 () { ( echo -n 'jäsenten arvot   : '; eval echo \${$1[*]}; echo -n 'jäsenten osoitteet : '; eval echo \${!$1[@]} ) | column -t ;}

function kirjoita_matriisi_levylle () { # ei kannata
eval echo  \${$1[@]} > ~/tiedosto1   # Matriisin $1 jäsenten arvot   
eval echo \${!$1[*]} > ~/tiedosto2   # Matriisin $1 jäsenten osoitteet
}

function lue_matriisi_levyltä () { 
unset $1 # varmistus sille että matriisi tosiaan luetaan levyltä eikä käytetä RAM:missa olevaa vanhaa kuvaa.
apu0=0
apu1=($(cat  ~/tiedosto1))
apu2=($(cat  ~/tiedosto2))
while true; do
  [[ -z ${apu1[$apu0]} ]] && break  
  eval "$1[${apu2[apu0]}]"="${apu1[apu0]}" 
  let apu0++
done
unset apu0 apu1 apu2  
}

 
function rivisummat () {
awk '{for(i=1;i<=NF;i++) t+=$i; print "rivisumma:",t; t=0}' $1  # taulukon rivisummien laskeminen kun taulukon kokoa ei tiedä
}

function sarakesummat () {
awk '{for(i=1;i<=NF;i++) s[i]+=$i} END {for(i=1;i<=NF;i++) print "sarakesumma=" s[i]}' $1 # taulukon sarakesummien laskeminen kun taulukon kokoa ei tiedä
}

function vastinalkiosumma () {
# samanmuotoisten matriisien vastinjäsenien yhteenlasku ja tulostus:
# tiedostoja voi lisätä tai poistaa käskystä muuttamatta missään mitään. Tiedostojen rivi- ja sarakeluku otetaan myös automaattisesti huomioon 
  awk 'FNR==1{cnt=1}
  NF>nf{nf=NF}
  {for(i=1;i<=nf;i++)s[cnt++]+=$i}
  END {for(i=1;i<cnt;i++)printf i%nf?"%d ":"%d\n",s[i]}' $1 $2 # ~/tiedosto1 ~/tiedosto2 ~/tiedosto3
}
 
function käänteismatriisi () { 
awk '{ for (i=1; i<=NF; i++)  {
        a[NR,i] = $i
    }}
NF>p { p = NF }
END {    
    for(j=1; j<=p; j++) {
        apu=a[1,j]
        for(i=2; i<=NR; i++){
            apu=apu" "a[i,j];
        }
        print apu }}' $1
}

function matriisien_ero(){
  awk 'BEGIN{RS=ORS=" "}
       {NR==FNR?a[$0]++:a[$0]--}
       END{for(k in a)if(a[k])print k}' <(echo -n "${!1}") <(echo -n "${!2}")
}

