BASH: print matrix from single array


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting BASH: print matrix from single array
# 1  
Old 04-30-2010
BASH: print matrix from single array

I am creating a report in groff and need to format data from a file into a
table cell.

Sample data:

Code:
dador,173323,bpt,jsp,39030013338878,1
dador,173323,brew,jsp,39030013338860,1
dador,173323,brew,jsp,39030013339447,1
dador,173323,brew,jsp,39030013339538,1

I would like to build a table such that the first column contains unique
data from the second column of the file. The second column would contain
data associated with unique item in column one:

example:
<tr>
<td>173323</td><td>jsp, nj, b, nb</td>
</tr>
<tr>
<td>360356</td><td>nj, b, nb, mjcd</td>
</tr>

My main issue is the second column cells as a matrix of data from a single
array should be printed between groff's T{ T} table macros.

example:

Code:
T{
mat, rc, wpl,
wat, q, che,
cc, ewen, ent,T}<TAB>item ...


So, to print a simple matrix I remember you can do something like:
Code:
rows=5
columns=5
for ((i=0;i<$rows;i++))
do
    for ((j=0;j<$columns;j++))
    do  
        printf $j
    done
    printf "$i\n"
done

But how could you print a matrix using a single array pulled from a file.
I've got the file read and the array created ...but how to I print it in a
4x? grid/matrix?

Would an awk script be more efficient for pulling this data and printing it
this way?

Thanks for reading!

Bubnoff
# 2  
Old 04-30-2010
In Bash, with some comments Smilie
Code:
#!/bin/bash

# We create an example array 'a' containing 16 values:
# array a = ( 0 1 2 3 4 ... 14 15 )
a=({0..15})

echo 'Linear array:'
echo ${a[*]}

# We now display this array 'a' in a 4x4 grid
echo 'Matrix array:'
for row in {1..4}; do
    for col in {1..4}; do
        echo -n ${a[((4*row+col-5))]}$'\t'
    done
    echo
done


Last edited by tukuyomi; 04-30-2010 at 04:44 PM.. Reason: Text formatting
# 3  
Old 04-30-2010
Thanks for your response!

While each row should contain a defined number of fields/elements,
the actual amount of rows is dependent on the length of the array.

So I'm thinking rows would need to be defined by dividing the
${#ARRAY[@]} by desired number of columns then adding 1
( for the remainder ).

Does this sound logical?

Thanks again! ...This is elementary to many of you, but I'm having
a bit of trouble working this out.

Bubnoff
# 4  
Old 04-30-2010
If this can help you, look at line 10, you can define how many columns you want to display.
Code:
#!/bin/bash

#We create an example array containing 16 values:
# array a = ( 0 1 2 3 4 ... 14 15 )
a=({0..15})
echo 'Linear array:'
echo ${a[*]}

# We define columns ans calculate rows accordingly
cols=6; rows=$((1+${#a[*]}/cols))

# We now display this array in a rows x cols grid
echo 'Matrix array:'
for ((row=1; row<=rows; row++)); do
    for ((col=1; col<=cols; col++)); do
        echo -n ${a[((cols*((row-1))+col-1))]}$'\t'
    done
    echo
done

# 5  
Old 04-30-2010
Rock and Roll!!!

Thanks tukuyomi!

Bub
# 6  
Old 04-30-2010
not really really sure of your description and sample files, but....

nawk -f bub.awk sampleData.txt

bub.awk:
Code:
BEGIN {
  FS=","
}
{
  c2[$2]=(c2[$2])?c2[$2] FS $1:$1
}
END {
  for (i in c2)
    printf("<tr>\n<td>%s</td><td>%s</td>\n</tr>\n", i, c2[i])
}

Actually, I've completely misunderstood it - never mind me....

Last edited by vgersh99; 04-30-2010 at 06:15 PM.. Reason: nvm
# 7  
Old 04-30-2010
Another question

This is what I've got and it seems to work.

Code:
ELEMENTS2=${#ARRAY2[*]}

cols=5
rows=$((ELEMENTS2/cols+1))

printf "Rows = $rows\n"
printf "Elements = $ELEMENTS2\n"

for (( row=1; row<=rows; row++)); do
    for ((col=1; col<=cols; col++)); do
        bib=${ARRAY2[((cols*((row-1))+col-1))]}
        next=${ARRAY2[((cols*((row-1))+col))]}
        if [[ -z "$next" ]]
        then
            printf "$bib"
        else
            printf "%s, " "$bib" 
        fi  
    done
    printf "\n"
done

If the next variable is null then it leaves off the trailing comma. My question is:

Am I accessing the next variable with:
Code:
next=${ARRAY2[((cols*((row-1))+col))]}

...?
Seems obvious, but thought I'd ask to make sure I'm following the logic
correctly. The output is as expected.

Thanks again!

Bub

UPDATE *** Nevermind, I get it.

Last edited by Bubnoff; 04-30-2010 at 06:13 PM.. Reason: Flash of understanding.
This User Gave Thanks to Bubnoff For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to print median values of matrix -awk?

I use the following script to print the sum and how could I extend this to print medians instead? thanks name s1 s2 s3 s4 g1 2 8 6 5 g1 5 7 9 9 g1 6 7 8 9 g2 8 8 8 8 g2 7 7 7 7 g2 10 10 10 10 g3 3 12 1 24 g3 5 5 24 48 g3 12 3 12 12 g3 2 3 3 3 output name s1 s2 s3 s4 g1 5 7 8 9... (5 Replies)
Discussion started by: quincyjones
5 Replies

2. UNIX for Beginners Questions & Answers

Limiting Bash array single line output

#!/bin/bash PH=(AD QD QC 5H 6C 8C 7D JH 3H 3S) echo ${PH} In the above array, how can I print to screen just the first 8 elements of ${PH} and have the last 2 elements print just below the first line starting underneath AD? I need to do this in order to save terminal window spacing... (5 Replies)
Discussion started by: cogiz
5 Replies

3. Shell Programming and Scripting

Help w/ Reading Matrix & Storing in dynamic array

First of I would just like to state that I am not looking for you guys to just do my work for me, I do want to learn and actually understand everything that is happening. Hey all, I am having trouble on this. What I need to do is... Write an executable C file that will take a text file (not a... (8 Replies)
Discussion started by: innvert
8 Replies

4. Shell Programming and Scripting

Make Separated files from a single matrix - Perl

Hey Masters, Here is my input: fragmentID chromosome start end HEL25E TRIP1 r5GATC2L00037 chr2L 5301 6026 0.03 0.036 r5GATC2L00038 chr2L 6023 6882 -0.025 -0.041 r5GATC2L00040 chr2R 6921 7695 -0.031 0.005 r5GATC2L00042 chr2R 7715 8554 -0.006 -0.024 r5GATC2L00043 chr3L 8551 8798 0.042 0... (4 Replies)
Discussion started by: @man
4 Replies

5. Shell Programming and Scripting

Print array into a single file - AWK

Hi all, I been looking for a solution to the fact that when I use: for (i=1; i<=NF; i++) print $ifields that are originally in a single line are printed in a single line I have severals files for which the first 7 are the same, but the number of variables after that can vary, for example NF... (5 Replies)
Discussion started by: PaulaL
5 Replies

6. Shell Programming and Scripting

how to output the array result into a matrix

I have a file like this: ASSPASVFETQY,hTRBV12-4,hTRBJ2-5,2 ASSPASTGGDYGYT,hTRBV18,hTRBJ1-2,2 ASSPASGDGYT,hTRBV5-1,hTRBJ1-2,2 ASSPASFPEDTQY,hTRBV27,hTRBJ2-3,2 ASSPARVNYGYT,hTRBV5-1,hTRBJ1-2,2 ASSPARTSGGLNEQF,hTRBV6-4,hTRBJ2-1,2 ASSPARQSYNEQF,hTRBV11-1,hTRBJ2-1,2... (3 Replies)
Discussion started by: xshang
3 Replies

7. UNIX for Dummies Questions & Answers

BASH - Creating a Matrix

I'm trying to create a Matrix using bash. The expected output is .AB CDE FG 1 2 3 4 5 6 7 I'm a newbie in shell language, really appreciate if there is anyone who can guide me with this. Double post again, continued here (0 Replies)
Discussion started by: vinzping
0 Replies

8. Shell Programming and Scripting

Perl question - How do I print contents of an array on a single line?

I have the following code: print @testarray; which returns: 8 8 8 9 How do I return the array like this: The output is: 8, 8, 8, 9 (5 Replies)
Discussion started by: streetfighter2
5 Replies

9. Shell Programming and Scripting

How can I print array elements as different columns in bash?

Hi Guys, I have an array which has numbers including blanks as follows: 1 26 66 4.77 -0.58 88 99 11 12 333 I want to print a group of three elements as a different column in a file as follows:(including blanks where there is missing elements) for.e.g. array element #7... (4 Replies)
Discussion started by: npatwardhan
4 Replies

10. Shell Programming and Scripting

PERL: How do i print an associative matrix?

Hello guys, I have in PERL an associative 2-dimensional array, called matrix. The array (actually the matrix) is made up like this matrix = x; matrix = y; matrix = w; matrix = z; ... but the names a, b, c, d are set just at runtime. The question is: how can i get all the keys of... (2 Replies)
Discussion started by: foo.bar
2 Replies
Login or Register to Ask a Question