Storing two dimensional array for postprocessing


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Storing two dimensional array for postprocessing
# 15  
Old 11-09-2016
Thanks Don & RudiC

I was able to modify the script and able to get the desired behavior. Below is my new script

Code:
#!/bin/ksh93

typeset -A cpuusage
{  read -A HD
  while read -A TMP
    do for i in ${!HD[@]}
        do
         cpuusage[${TMP[0]}","${HD[$i]}]=$(( ${cpuusage[${TMP[0]}","${HD[$i]}]} + ${TMP[$i]} ))
        done
    done
} <<< $(mpstat -P ALL | awk '{ $1=""; print $0 }' | awk 'NR>=3')

mpstat -P ALL | awk '{ $1=""; print $0 }' | awk 'NR>=3'
echo ${cpuusage["14,%sys"]}

Now moving to my next step.

Question:
I am using this cpuusage array within a while loop and repeating it for a pre-defined period. Now I want to use this cpuusage array and extract values outside the while loop and save it into a file. Looks like the scope of cpuusage is not available outside the while loop. Below is the snippet of my main script

Code:
		while true
			do
					echo "Sampling started"
					
						typeset -A cpuusage
						{  read -A HD
						  while read -A TMP
							do for i in ${!HD[@]}
								do
								 cpuusage[${TMP[0]}","${HD[$i]}]=$(( ${cpuusage[${TMP[0]}","${HD[$i]}]} + ${TMP[$i]} ))
								done
							done
						} <<< $(mpstat -P ALL | awk '{ $1=""; print $0 }' | awk 'NR>=3')

						echo "sampling done"
						
						if [ $SCANTIME -eq $GRANULARITYPERIOD ]
						then
								break 2
						fi

						sleep $SCANTIME
						SCANTIME=$((SCANTIME+5))
						echo "------------------"
						echo "SCANNING TIME: $SCANTIME"

			done

		echo "TRYING TO PROCESS OUTPUT"

			for CPUCORE in [0..19]
			do
				cat >> $pmFilename <- EOM
											<r p="1">`echo "scale=2; ${cpuusage["$CPUCORE,%iowait"]}/3" | bc -l | sed 's/^\./0./'`</r>
											<r p="2">`echo "scale=2; ${cpuusage["$CPUCORE,%irq"]}/3" | bc -l | sed 's/^\./0./'`</r>
											<r p="3">`echo "scale=2; ${cpuusage["$CPUCORE,%nice"]}/3" | bc -l | sed 's/^\./0./'`</r>
											<r p="4">`echo "scale=2; ${cpuusage["$CPUCORE,%soft"]}/3" | bc -l | sed 's/^\./0./'`</r>
											<r p="5">`echo "scale=2; ${cpuusage["$CPUCORE,%sys"]}/3" | bc -l | sed 's/^\./0./'`</r>
											<r p="6">`echo "scale=2; ${cpuusage["$CPUCORE,%idle"]}/3" | bc -l | sed 's/^\./0./'`</r>
											<r p="7">`echo "scale=2; ${cpuusage["$CPUCORE,%usr"]}/3" | bc -l | sed 's/^\./0./'`</r>
				EOM
			done

---------- Post updated 11-09-16 at 12:35 AM ---------- Previous update was 11-08-16 at 05:49 PM ----------

Got it sorted, my for loop was incorrect Smilie

Code:
for CPUCORE in {0..19}

# 16  
Old 11-09-2016
Now that you bring awk into play, did you consider to use it for the overall solution, i.e. do the entire thing in one single awk script?
# 17  
Old 11-09-2016
I would replace
Code:
cpuusage[${TMP[0]}","${HD[$i]}]=$(( ${cpuusage[${TMP[0]}","${HD[$i]}]} + ${TMP[$i]} ))

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

And
Code:
$(mpstat -P ALL | awk '{ $1=""; print $0 }' | awk 'NR>=3')

by
Code:
"$(mpstat -P ALL | awk 'NR>=3 { $1=""; print }')"

And
Code:
echo "scale=2; ${cpuusage["$CPUCORE,%sys"]}/3" | bc -l | sed 's/^\./0./'

by ksh-builtins
Code:
printf "%.2f\n" $(( cpuusage["$CPUCORE,%sys"]}/3.0 ))

Still I doubt there will be any real profit - besides the good practical excercise!

Last edited by MadeInGermany; 11-09-2016 at 05:26 PM.. Reason: 3.0 enforces a cast from int to fp (or typeset -F)
# 18  
Old 11-09-2016
RudiC - Not really. You have seen how good I am in the scripting Smilie
Attempting this would be another big exercise. I will look at it once I finish this script

MadeInGermany - Thanks for the recommendations, I will adopt your changes

------

Another question related to how to initiate execution of this script that I am preparing
1. I do not want to use cronjob as we do not have permission to use
2. I would like to start the script on the next possible quarter hour
e.g. Current time is 11:46. If I run the script, it should pause initially and continue executing from 12:00

How can I implement this without using cronjob
# 19  
Old 11-10-2016
Do you have the at utility available?

And, please post the desired output from a (reduced: 2 - 3 cpus, 2 - 3 time points) input sample.
# 20  
Old 11-10-2016
Yes, I do have at utility in my system.

Sorry, did not understand whether you need the output of the script or the input to the script. i.e
Code:
mpstat

command output
# 21  
Old 11-10-2016
Both. As I don't have any experience woth mpstat, please prepare an input sample for, say, 3 cpus and 3 intervals, e.g. 5 minutes apart, and the final result after the overall processing.
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