Storing two dimensional array for postprocessing


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Storing two dimensional array for postprocessing
# 8  
Old 11-07-2016
Some improvement, but still fails with ksh93

Code:
# more a.ksh 
#!/bin/ksh93

typeset cpuusage
{ read
  read
  read -A HD
  while read -A TMP
    do for i in ${!HD[@]}
         do cpuusage[${TMP[1]}","${HD[$i]}]=${TMP[$i]}
         done
    done
} < x
echo ${cpuusage[2,%soft]}
#
#./a.ksh 
./a.ksh: line 9: :: invalid character in expression - all,09:30:09
./a.ksh: line 13: 2,%soft: arithmetic syntax error
#
#
#
# more x 
Linux 3.0.101-0.15.1.6550.0.PTF-default (SC-1)  11/08/16        _x86_64_

09:30:09     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
09:30:09     all    0.07    0.00    0.09    0.00    0.00    0.02    0.00    0.00   99.82
09:30:09       0    0.14    0.00    0.09    0.00    0.00    0.02    0.00    0.00   99.75
09:30:09       1    0.07    0.00    0.07    0.00    0.00    0.01    0.00    0.00   99.85
09:30:09       2    0.07    0.00    0.12    0.00    0.00    0.04    0.00    0.00   99.77
09:30:09       3    0.22    0.00    0.20    0.00    0.00    0.05    0.00    0.00   99.53
09:30:09       4    0.12    0.00    0.15    0.00    0.00    0.01    0.00    0.00   99.72
09:30:09       5    0.11    0.00    0.18    0.00    0.00    0.02    0.00    0.00   99.69
09:30:09       6    0.08    0.00    0.04    0.00    0.00    0.00    0.00    0.00   99.88
09:30:09       7    0.07    0.00    0.05    0.00    0.00    0.00    0.00    0.00   99.88
09:30:09       8    0.07    0.00    0.04    0.00    0.00    0.00    0.00    0.00   99.89
09:30:09       9    0.12    0.00    0.05    0.00    0.00    0.00    0.00    0.00   99.83
09:30:09      10    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95
09:30:09      11    0.03    0.00    0.09    0.00    0.00    0.04    0.00    0.00   99.85
09:30:09      12    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.94
09:30:09      13    0.07    0.00    0.03    0.00    0.00    0.00    0.00    0.00   99.90
09:30:09      14    0.03    0.00    0.40    0.00    0.00    0.18    0.00    0.00   99.39
09:30:09      15    0.05    0.00    0.10    0.00    0.00    0.00    0.00    0.00   99.84
09:30:09      16    0.07    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.91
09:30:09      17    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95
09:30:09      18    0.02    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95
09:30:09      19    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95

# 9  
Old 11-08-2016
Hi Scrutinizer,
With bash, you declare an associative array with:
Code:
declare -a array_name

but with ksh93, you use:
Code:
typeset -A array_name

Hi sshark,
You're close, but there are two small problems:
Change:
Code:
typeset cpuusage

to:
Code:
typeset -A cpuusage

and change:
Code:
echo ${cpuusage[2,%soft]}

to:
Code:
echo ${cpuusage["2,%soft"]}

and then your script will do what I think you want it to do.
This User Gave Thanks to Don Cragun For This Post:
# 10  
Old 11-08-2016
Hi Don,

Now the script works with your recommended changes

I do have a question though. The script we have drafted feeds input from a file.

However how could I directly feed the output of
Code:
mpstat

command into the script

Will this work ?

Code:
#!/bin/ksh93

typeset -A cpuusage
{ read
  read
  read -A HD
  while read -A TMP
    do for i in ${!HD[@]}
         do cpuusage[${TMP[1]}","${HD[$i]}]=${TMP[$i]}
         done
    done
} < `mpstat -P ALL`

echo ${cpuusage["14,%soft"]}

Lets say if I run this script every 5mins, Is it possible to increment the values of cpuusage array to add to its previous value and store it . Then I can easily average it based on the number of sampling at the final sampling period ?

Last edited by sshark; 11-08-2016 at 02:03 AM..
# 11  
Old 11-08-2016
Quote:
Originally Posted by sshark
Hi Don,

Now the script works with your recommended changes

I do have a question though. The script we have drafted feeds input from a file.

However how could I directly feed the output of
Code:
mpstat

command into the script

Will this work ?

Code:
#!/bin/ksh93

typeset -A cpuusage
{ read
  read
  read -A HD
  while read -A TMP
    do for i in ${!HD[@]}
         do cpuusage[${TMP[1]}","${HD[$i]}]=${TMP[$i]}
         done
    done
} < `mpstat -P ALL`

echo ${cpuusage["14,%soft"]}

No. The operand to the redirection operator (i.e. <) is the name of a file to be opened for reading. The output from running the mpstat utility is not the pathname of a file. You could, however, change:
Code:
} < `mpstat -P ALL

to:
Code:
} <<< `mpstat -P ALL`

or, using the non-obsolete form of command substitution:
Code:
} <<< $(mpstat -P ALL)


Quote:
Lets say if I run this script every 5mins, Is it possible to increment the values of cpuusage array to add to its previous value and store it . Then I can easily average it based on the number of sampling at the final sampling period ?
Of course. Arithmetic expansions work just fine as the right hand side of an assignment command:
Code:
cpuusage[${TMP[1]}","${HD[$i]}]=$(( ${cpuusage[${TMP[1]}","${HD[$i]}]} + ${TMP[$i]} ))

# 12  
Old 11-08-2016
Thanks Don, I am almost there. Now I am able to feed the mpstat output.

You suggestion to second question is still not working as per the requirement.

Let me output the contents

Code:
Linux 3.0.101-0.15.1.6550.0.PTF-default (SC-1)  11/08/16        _x86_64_

22:56:12     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
22:56:12     all    0.07    0.00    0.09    0.00    0.00    0.02    0.00    0.00   99.82
22:56:12       0    0.14    0.00    0.09    0.00    0.00    0.02    0.00    0.00   99.75
22:56:12       1    0.07    0.00    0.07    0.00    0.00    0.01    0.00    0.00   99.85
22:56:12       2    0.07    0.00    0.12    0.00    0.00    0.04    0.00    0.00   99.77
22:56:12       3    0.22    0.00    0.20    0.00    0.00    0.05    0.00    0.00   99.53
22:56:12       4    0.12    0.00    0.15    0.00    0.00    0.01    0.00    0.00   99.72
22:56:12       5    0.11    0.00    0.18    0.00    0.00    0.02    0.00    0.00   99.69
22:56:12       6    0.08    0.00    0.04    0.00    0.00    0.00    0.00    0.00   99.87
22:56:12       7    0.07    0.00    0.05    0.00    0.00    0.00    0.00    0.00   99.88
22:56:12       8    0.07    0.00    0.04    0.00    0.00    0.00    0.00    0.00   99.89
22:56:12       9    0.12    0.00    0.04    0.00    0.00    0.00    0.00    0.00   99.83
22:56:12      10    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95
22:56:12      11    0.03    0.00    0.09    0.00    0.00    0.04    0.00    0.00   99.85
22:56:12      12    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.94
22:56:12      13    0.07    0.00    0.03    0.00    0.00    0.00    0.00    0.00   99.90
22:56:12      14    0.03    0.00    0.40    0.00    0.00    0.18    0.00    0.00   99.39
22:56:12      15    0.05    0.00    0.10    0.00    0.00    0.00    0.00    0.00   99.84
22:56:12      16    0.07    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.91
22:56:12      17    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95
22:56:12      18    0.02    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95
22:56:12      19    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95

As you can see, when we store the CPU usage in cpuusage array, I only need to keep the CPU usage accumulated (add the reading to the previous reading). You suggestion to add using below command even tries to add first column and CPU#, which is not required

Code:
cpuusage[${TMP[1]}","${HD[$i]}]=$(( ${cpuusage[${TMP[1]}","${HD[$i]}]} + ${TMP[$i]} ))

# 13  
Old 11-08-2016
It always helps to experiment and do some reading, e.g. man pages. For your lastmost problem, start the evaluation/calculation only at the third column. Try
Code:
{ read
  read
  read -a HD
  while read -a TMP
     do for (( i=2; i<${#HD[@]}; i++ ))
          do ((cpuusage[${TMP[1]}","${HD[$i]}]+=${TMP[$i]}))
          done
     done
 } < file

Please note that this is tested in bash using integers only as bash unlike ksh doesn't offer shell floating number arithmetics.
# 14  
Old 11-08-2016
Quote:
Originally Posted by sshark
Thanks Don, I am almost there. Now I am able to feed the mpstat output.

You suggestion to second question is still not working as per the requirement.

Let me output the contents

Code:
Linux 3.0.101-0.15.1.6550.0.PTF-default (SC-1)  11/08/16        _x86_64_

22:56:12     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
22:56:12     all    0.07    0.00    0.09    0.00    0.00    0.02    0.00    0.00   99.82
22:56:12       0    0.14    0.00    0.09    0.00    0.00    0.02    0.00    0.00   99.75
22:56:12       1    0.07    0.00    0.07    0.00    0.00    0.01    0.00    0.00   99.85
22:56:12       2    0.07    0.00    0.12    0.00    0.00    0.04    0.00    0.00   99.77
22:56:12       3    0.22    0.00    0.20    0.00    0.00    0.05    0.00    0.00   99.53
22:56:12       4    0.12    0.00    0.15    0.00    0.00    0.01    0.00    0.00   99.72
22:56:12       5    0.11    0.00    0.18    0.00    0.00    0.02    0.00    0.00   99.69
22:56:12       6    0.08    0.00    0.04    0.00    0.00    0.00    0.00    0.00   99.87
22:56:12       7    0.07    0.00    0.05    0.00    0.00    0.00    0.00    0.00   99.88
22:56:12       8    0.07    0.00    0.04    0.00    0.00    0.00    0.00    0.00   99.89
22:56:12       9    0.12    0.00    0.04    0.00    0.00    0.00    0.00    0.00   99.83
22:56:12      10    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95
22:56:12      11    0.03    0.00    0.09    0.00    0.00    0.04    0.00    0.00   99.85
22:56:12      12    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.94
22:56:12      13    0.07    0.00    0.03    0.00    0.00    0.00    0.00    0.00   99.90
22:56:12      14    0.03    0.00    0.40    0.00    0.00    0.18    0.00    0.00   99.39
22:56:12      15    0.05    0.00    0.10    0.00    0.00    0.00    0.00    0.00   99.84
22:56:12      16    0.07    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.91
22:56:12      17    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95
22:56:12      18    0.02    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95
22:56:12      19    0.03    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95

As you can see, when we store the CPU usage in cpuusage array, I only need to keep the CPU usage accumulated (add the reading to the previous reading). You suggestion to add using below command even tries to add first column and CPU#, which is not required

Code:
cpuusage[${TMP[1]}","${HD[$i]}]=$(( ${cpuusage[${TMP[1]}","${HD[$i]}]} + ${TMP[$i]} ))

I assumed that you had written the code you had shown us and understood what it was doing. I showed you a syntax for adding fields and assumed that you would be able to modify your own code to do straight assignments or to skip assigning anything at all for data in columns you didn't want to sum.

Quote:
Originally Posted by RudiC
It always helps to experiment and do some reading, e.g. man pages. For your lastmost problem, start the evaluation/calculation only at the third column. Try
Code:
{ read
  read
  read -a HD
  while read -a TMP
     do for (( i=2; i<${#HD[@]}; i++ ))
          do ((cpuusage[${TMP[1]}","${HD[$i]}]+=${TMP[$i]}))
          done
     done
 } < file

Please note that this is tested in bash using integers only as bash unlike ksh doesn't offer shell floating number arithmetics.
Assuming that you don't need to keep any data from the first two columns of your data, the code RudiC suggested above should also work just fine in a recent Korn shell as long as you change the read -a to read -A in both of the places where it occurs.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Multi Dimensional array

I have an array of names. Each one of the name, has a number represented to it. For example A has an ID 8, B has an ID 2. What I am after is a for loop that when the array is in position 1, a particular variable is set to the value of position 1 in array 2 declare -a arr=("A" "B" "C"... (6 Replies)
Discussion started by: nms
6 Replies

2. Shell Programming and Scripting

Store in a 2 dimensional array - Perl

Hey guyz. Here is my sample input file following by first part of my code: * A B C D E reg1 1 0 1 1 0 reg2 0 1 0 0 1 reg3 1 0 0 1 0 reg4 0 0 1 0 1 reg5 1 1 0 0 1 use strict; use warnings; open (IN, "test_input.txt") or die ("Can't open file.txt: $!\n"); my $line = <IN>; ... (2 Replies)
Discussion started by: @man
2 Replies

3. Programming

Return two dimensional array in c++

I am writing matrix multiplication and trying to return a two dimensional array from a function but I keep getting errors. Can someone please help me? here is my code (it is just the skeleton of my program): void main () { ... int *matmultiply (int, int, int, int , int , int ) ... } ... (4 Replies)
Discussion started by: saboture88
4 Replies

4. Programming

Passing two dimensional array to a function

Hi. I have a problem with passing two dimensional array to a function. First, let me show my code to explain what i am going to do: I have function:void initialize_board(char board);which is supposed to modify content of passed array. I have read here: Question 6.18 how such arrays should be... (3 Replies)
Discussion started by: Shang
3 Replies

5. UNIX for Dummies Questions & Answers

Help: stdin to multi-dimensional array

I cant get out of this while loop at the beginning of my program. Just reading from stdin one char at a time and storing it into a multi-array. Need to fix it with in two hours. #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include... (1 Reply)
Discussion started by: unt_engn
1 Replies

6. Shell Programming and Scripting

sorting multi dimensional array

Hi there, Can someone let me know how to sort the 2 dimensional array below by column 1 then by column 2? 22 55 2222 2230 33 66 44 58 222 240 11 25 22 60 33 45 output: 11 25 22 55 22 60 33 45 33 66 44 58 (6 Replies)
Discussion started by: phoeberunner
6 Replies

7. Shell Programming and Scripting

PHP: Search Multi-Dimensional(nested) array and export values of currenly worked on array.

Hi All, I'm writing a nagios check that will see if our ldap servers are in sync... I got the status data into a nested array, I would like to search key of each array and if "OK" is NOT present, echo other key=>values in the current array to a variable so...eg...let take the single array... (1 Reply)
Discussion started by: zeekblack
1 Replies

8. Shell Programming and Scripting

2 dimensional array in unix

I am trying to implementing two dimensinal array in ksh script.Would you pls help me out. I have a large size of file, File contains looks like ID SID VLAUE1 VALUE2 TOTALVALUE 1 a1 01 02 03 1 b1 02 05 07 ... (2 Replies)
Discussion started by: pritish.sas
2 Replies

9. Shell Programming and Scripting

Help for record (2 dimensional array.)

I am going to develop a address book using the shell scripting commands without sed, awk, .... I am thinking to apply the concept of 2 dimenstional array. Can I create a two dimensional array for the insertion/updation/deletion of record in unix. If yes then tell me plz or recommend me some... (1 Reply)
Discussion started by: murtaza
1 Replies

10. Shell Programming and Scripting

Reference two dimensional array in Perl sub

I am trying to reference a two dimensional array in a subroutine and can't seem to figure this one out in Perl. Does anybody know? Please enlighten me. #!/usr/bin/perl -w use constant DIM => 4; sub Shift_elements_right{ my (@Input, @Output) = @_; for ($i = 0 ; $i <= DIM ;... (5 Replies)
Discussion started by: photon
5 Replies
Login or Register to Ask a Question