Transpose columns to Rows


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Transpose columns to Rows
# 15  
Old 01-28-2011
Seems the AT&T awk. Could you try to install the GNU awk?
# 16  
Old 01-28-2011
This version not need array and mem, but more cpu and disk i/o.
1st col is filename and 2nd col is line in file.
Code:
#!/bin/ksh
delim=";"
rm -f *.key 2>/dev/null
cat file | while read key value xxx
do
        [ "$value" = "" ] && continue  # less than 2 value in line
        echo $value >> $key.key
done

maxsize=0   # how many lines we need = number of lines in file
for col in *.key
do
        size=$(cat $col | wc -l)
        ((size>maxsize)) && maxsize=$size
        colname=${col%%.*}  # remove last value after dot = name of col
        print -n "$colname$delim"
done
echo

line=1
while ((line<=maxsize))
do
        for col in *.key
        do
                value=$(sed -n "${line}p" $col 2>/dev/null )   # take Nth line from file
                print -n "$value$delim"
        done
        echo
        ((line+=1))
done

# 17  
Old 01-28-2011
@ rad:
Installed gak 3.1.8 version and still no output and my mac is screaming.

@kshji
How do I use your code ?
My file looks like

Code:
name a1  a2 .....a200
n1  0  2.4..........0.339
.
.
.
n200000  139.9  333339.9........0.989

# 18  
Old 01-28-2011
This code keeps rereading the file (so it is slower) but it does not use a lot of memory
Code:
awk 'NR==1{for(i=2;i<=NF;i++)ARGV[ARGC++]=ARGV[1]}
     FNR==1{print x;c++}{printf "%s"FS,$c}END{print x}' infile

So you perhaps you could give that a try. I have not tested it on large matrices, There should only be one input file with no empty lines in it.

Last edited by Scrutinizer; 01-28-2011 at 10:10 PM..
# 19  
Old 01-29-2011
My solution was solution for aravindj80 original data. Simplified solution from original.
Next is solution also if you have more cols / line. Only split cols to the keyfile, value/line. Solution include also data which I used to test.
Code:
cat <<EOF > $0.tmp
Start
A 1 K1 k1
B 2
C 3 T2 t4
D 4 C5 c4 cc6 hg55
E 5
End

Start
A 11
B 12
C 23 C5a c4a cc6a hg55a
D 25
E 21
End

Start
A 71
B 12
D 75
E 21
End
EOF

rm -f *.key 2>/dev/null
delim=";"
# 1st col values are now name of the files => name of the col and other values are lines in the file.
cat $0.tmp | while read key values
do
        [ "$values" = "" ] && continue
        for value in $values
        do
                echo $value >> $key.key
        done
done
# now data is in the files, printout

maxsize=0  # height of the output table = number of the lines in file
for col in *.key
do
        size=$(cat $col | wc -l)
        ((size>maxsize)) && maxsize=$size
        colname=${col%%.*}
        print -n "$colname$delim"
done
echo

# now we have height for the output table
line=1
while ((line<=maxsize))
do
        for col in *.key
        do
                value=$(sed -n "${line}p" $col)   # take Nth line from the file
                print -n "$value$delim"
        done
        echo
        ((line+=1))
done

# 20  
Old 01-29-2011
Code:
$ <abc tr ' ' '\n' | pr -5 -s' ' -t

Code:
$ cat abc
A 1
B 2
C 3
D 4
E 5
$ <abc tr ' ' '\n' | pr -5 -s' ' -t
A B C D E
1 2 3 4 5
$


Last edited by ctsgnb; 01-29-2011 at 05:03 AM..
# 21  
Old 02-01-2011
Hi Scrutinizer,

I just started to pick up UNIX recently and know close to nothing about it, so please pardon my dumb question. Your code works great for my file, but it split columns by a space. How can I make it split by a tab instead? My input file is some what like this
A A B B C C
D D E E F F

and I want it to becomes the following
A A D D
B B E E
C C F F

not like this:

A D
A D
B E
B E
C F
C F

Thank you so much!

Quote:
Originally Posted by Scrutinizer
This code keeps rereading the file (so it is slower) but it does not use a lot of memory
Code:
awk 'NR==1{for(i=2;i<=NF;i++)ARGV[ARGC++]=ARGV[1]}
     FNR==1{print x;c++}{printf "%s"FS,$c}END{print x}' infile

So you perhaps you could give that a try. I have not tested it on large matrices, There should only be one input file with no empty lines in it.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Transpose rows to certain columns

Hello, I have the following data and I want to use awk to transpose each value to a certain column , so in case the value is not available the column should be empty. Example: Box Name: BoxA Weight: 1 Length :2 Depth :3 Color: red Box Name: BoxB Weight: 3 Length :4 Color: Yellow... (5 Replies)
Discussion started by: rahman.ahmed
5 Replies

2. Shell Programming and Scripting

Transpose rows to columns complex

Input: IN,A,1 IN,B,3 IN,B,2 IN,C,7 BR,A,1 BR,A,5 BR,C,9 AR,C,9 Output: CNTRY,A,B,C IN,1,5,7 BR,6,0,9 AR,0,0,9 (7 Replies)
Discussion started by: unme
7 Replies

3. Shell Programming and Scripting

awk to transpose every 7 rows into columns

input: a1 a2 a3 a4 a5 a6 a7 b1 b2 b3 .. b7 .. z1 .. z7 (12 Replies)
Discussion started by: ux4me
12 Replies

4. Shell Programming and Scripting

Columns to Rows - Transpose - Special Condition

Hi Friends, Hope all is well. I have an input file like this a gene1 10 b gene1 2 c gene2 20 c gene3 10 d gene4 5 e gene5 6 Steps to reach output. 1. Print unique values of column1 as column of the matrix, which will be a b c (5 Replies)
Discussion started by: jacobs.smith
5 Replies

5. Shell Programming and Scripting

Transpose Data from Columns to rows

Hello. very new to shell scripting and would like to know if anyone could help me. I have data thats being pulled into a txt file and currently have to manually transpose the data which is taking a long time to do. here is what the data looks like. Server1 -- Date -- Other -- value... (7 Replies)
Discussion started by: Mikes88
7 Replies

6. Shell Programming and Scripting

transpose rows to columns

Any tips on how I can awk the input data to display the desired output per below? Thanking you in advance. input test data: 2 2010-02-16 10:00:00 111111111111 bytes 99999999999 bytes 90% 4 2010-02-16 12:00:00 333333333333 bytes 77777777777 bytes 88% 5 2010-02-16 11:00:00... (4 Replies)
Discussion started by: ux4me
4 Replies

7. Shell Programming and Scripting

Transpose Rows Into Columns

I'm aware there are a lot of resources dedicated to the question of transposing rows and columns, but I'm a total newbie at this and the task appears to be beyond me. I have 40 text files with content that looks like this: Dokument 1 von 146 Orange County Register (California) June 26, 2010... (2 Replies)
Discussion started by: spindoctor
2 Replies

8. Shell Programming and Scripting

Transpose columns to Rows : Big data

Hi, I did read a few posts on the subjects, tried out a few solutions, but did not solve my problem. https://www.unix.com/302121568-post11.html https://www.unix.com/shell-programming-scripting/137953-large-file-columns-into-rows-etc-4.html Please help. Problem very similar to the second link... (15 Replies)
Discussion started by: genehunter
15 Replies

9. Shell Programming and Scripting

Transpose multipe columns to rows and adding headers

Hi, I found the following awk script to transpose multiple (3) columns to multiple rows: #=== BEGIN {FS=","} { for (i=1;i<=NF;i++) { arr=$i; if(nf<= NF) nf=NF; } nr=NR } END { for(i=1;i<=nf;i++) { (8 Replies)
Discussion started by: Gery
8 Replies

10. Shell Programming and Scripting

Rows to Columns - File Transpose

Hi I have an input file and I want to transpose it but I need to take care that if any field is missing for a record it should be popoulated with space for that field - using a shell script INFILE ---------- emp=1 sal=2 loc=abc emp=2 sal=21 sal=22 loc=xyz emp=5 loc=abc OUTFILE... (10 Replies)
Discussion started by: 46019
10 Replies
Login or Register to Ask a Question