Rows to Columns


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Rows to Columns
# 1  
Old 12-20-2012
Rows to Columns

Hi Guru's,
I have a requirement where i need to convert rows to column based on a key column.

Code:
Input:
Account_id|Trip_Org|Trip_Dest|City|Hotel_Nm
123|DFW|CHI|Dallas|Hyatt
123|LAS|LPA|Vegas|Hyatt Palace

Output:
123|Trip_Org1=DFW,Trip_Org2=LAS,Trip_Dest1=CHI,Trip_Dest2=LPA|City1=Dallas,City2=Vegas|Hotel_Nm1=Hyatt,Hotel_Nm2=Hyatt Palace

Please help me with the code to achieve this.

Note:
There are no MAX limit on any column values
# 2  
Old 12-20-2012
Does it matter which is 1 ? Rows have no order, strictly speaking.

Is it always 2 for 1?

You can achieve this in any shell, awk, perl, C, C++, JAVA or SQL:
Code:
select
  Account_id,
  "Trip_Org1="
   || a.Trip_Org
   || ",Trip_Org2="
   || b.Trip_Org
   AS Trip_Org,
  "Trip_Dest1=" 
   || a.Trip_Dest
   || ",Trip_Dest2="
   || b.Trip_Dest
   AS Trip_Dest,
  "City1="
   || a.City
   || ",City2="
   || b.City
   AS City,
  "Hotel_Nm1="
   || a.Hotel_Nm
   || ",Hotel_Nm2="
   || b.Hotel_Nm
   AS Hotel_Nm
 from
  input a
   join input b
    using Account_id
 where
  a.Trip_Org < b.Trip_Org
 order by 1

# 3  
Old 12-20-2012
This will work with nawk for exactly the sample file you have given (but I guess there will come more sophisticated input files):
Code:
awk 'NR==1 {n = split ($0, Hd, "|")}
     NR>1  {m = split ($0, Tmp, "|"); for (i=2;i<=n;i++) Out[i]=(Out[i]?Out[i]",":"")Hd[i]NR-1"="Tmp[i]}
     END   {printf "%s",Tmp[1]; for (i=2;i<=n;i++) printf "|%s", Out[i]; printf "\n"}
    ' file
123|Trip_Org1=DFW,Trip_Org2=LAS|Trip_Dest1=CHI,Trip_Dest2=LPA|City1=Dallas,City2=Vegas|Hotel_Nm1=Hyatt,Hotel_Nm2=Hyatt Palace

If e.g. the key value in col 1 will change, pls make up your own solution checking for col 1, print out values so far, delete the Out array and start over...
# 4  
Old 12-20-2012
You can do something similar in bash with indexed arrays for the input, saved header, and output, if in a subshell you add '|' to the front of $IFS (If the word is double-quoted, ${name[*]} expands to a single word with the value of each array member separated by the first character of the IFS special variable), read -a, etc. that will accomodate any nnumber and name columns and rows dynamically (assuming they are sorted on the key column). The usual challenges on starting and ending the loop do not go away. That is why they invented SQL, text ODBC and JDBC, Excel, etc.
# 5  
Old 12-21-2012
Try

Code:
awk -F \| 'NR==1{n=split($0,P,"|")}
NR>1{A[$1]++;for(i=2;i<=NF;i++){arr[$1,P[i]]=arr[$1,P[i]]?arr[$1,P[i]]","P[i]""A[$1]"="$i:P[i]""A[$1]"="$i}}
END{for(j in A){printf j; for(i=2;i<=n;i++){printf "|%s", arr[j,P[i]]}print "";}}' file

Quote:
Originally Posted by RudiC
Code:
awk 'NR==1 {n = split ($0, Hd, "|")}
     NR>1  {m = split ($0, Tmp, "|"); for (i=2;i<=n;i++) Out[i]=(Out[i]?Out[i]",":"")Hd[i]NR-1"="Tmp[i]}
     END   {printf "%s",Tmp[1]; for (i=2;i<=n;i++) printf "|%s", Out[i]; printf "\n"}
    ' file
123|Trip_Org1=DFW,Trip_Org2=LAS|Trip_Dest1=CHI,Trip_Dest2=LPA|City1=Dallas,City2=Vegas|Hotel_Nm1=Hyatt,Hotel_Nm2=Hyatt Palace

Highlighted one may cause problem if input changes. Assume $1 has has total more than 2 different values.

like
Code:
Account_id|Trip_Org|Trip_Dest|City|Hotel_Nm
123|DFW|CHI|Dallas|Hyatt
123|LAS|LPA|Vegas|Hyatt Palace
1f3|DFW|CHI|Dallas|Hyatt
1f3|LAS|LPA|Vegas|Hyatt Palace

This User Gave Thanks to pamu For This Post:
# 6  
Old 12-21-2012
you may try below perl

Code:
while(<DATA>){
	chomp;
	my @tmp = split(/\|/,$_);
	if($. == 1){
		@names = @tmp[1..$#tmp];
		next;
	}
	else{
		for(my $i=1;$i<=$#tmp;$i++){
			push @{$hash{$tmp[0]}->{$i}}, $tmp[$i];
		}
	}
}
foreach my $k (sort {$a<=>$b }keys %hash){
	print $k," ";
	my %h = %{$hash{$k}};
	foreach my $kk (sort {$a<=>$b} keys %h){
		my @arr = @{$h{$kk}};
		for(my $j=0;$j<=$#arr;$j++){
			print $names[$kk-1].'_'.$j.'='.$arr[$j].",";
		}
	}
	print "\n";
}
__DATA__
Account_id|Trip_Org|Trip_Dest|City|Hotel_Nm
123|DFW|CHI|Dallas|Hyatt
123|LAS|LPA|Vegas|Hyatt Palace
456|DFW|CHI|Dallas|Hyatt
456|LAS|LPA|Vegas|Hyatt Palace
456|DFW|CHI|Dallas|Hyatt
456|LAS|LPA|Vegas|Hyatt Palace

This User Gave Thanks to summer_cherry For This Post:
# 7  
Old 12-21-2012
On sample file :
Code:
Account_id|Trip_Org|Trip_Dest|City|Hotel_Nm
123|DFW|CHI|Dallas|Hyatt
123|LAS|LPA|Vegas|Hyatt Palace
124|4_DFW|4_CHI|4_Dallas|4_Hyatt
124|4_LAS|4_LPA|4_Vegas|4_Hyatt Palace

Code:
BEGIN {FS="|";fmt="%s|Trip_Org1=%s,Trip_Org2=%s,Trip_Dest1=%s,Trip_Dest2=%s|City1=%s,City2=%s|Hotel_Nm1=%s,Hotel_Nm2=%s\n"}
NR==1{next}
!NR-1%2{z=$0;getline}
{$0=z"|"$0;printf fmt, $1,$2,$7,$3,$8,$4,$9,$5,$10}


Last edited by ripat; 12-21-2012 at 02:58 AM..
This User Gave Thanks to ripat For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Columns to rows

HI UNIX Gurus, Not sure if this was already asked and an UNIX Guru has replied but I could not find what i wanted. I have linux environment and need help on this. I have several files like this. a,1 b,1 utc,10/12/2019 local,10/12/2018 name,xxxy deg,feh 10,12 20,8 30,50 32,64 46,65... (5 Replies)
Discussion started by: Roopensingh
5 Replies

2. Shell Programming and Scripting

Rows to columns

Hi, I have a text file with records as below Service Contract: Account Type: Client Number: Group Number: Account Currency: I want to print 2nd,3rd and 5th as a separate column, like -> Account Type: ,Client Number: ,Account Currency: How can I do that? (1 Reply)
Discussion started by: dsid
1 Replies

3. Shell Programming and Scripting

Compare 2 csv files by columns, then extract certain columns of matcing rows

Hi all, I'm pretty much a newbie to UNIX. I would appreciate any help with UNIX coding on comparing two large csv files (greater than 10 GB in size), and output a file with matching columns. I want to compare file1 and file2 by 'id' and 'chain' columns, then extract exact matching rows'... (5 Replies)
Discussion started by: bkane3
5 Replies

4. Shell Programming and Scripting

Evaluate 2 columns, add sum IF two columns match on two rows

Hi all, I know this sounds suspiciously like a homework course; but, it is not. My goal is to take a file, and match my "ID" column to the "Date" column, if those conditions are true, add the total number of minutes worked and place it in this file, while not printing the original rows that I... (6 Replies)
Discussion started by: mtucker6784
6 Replies

5. Shell Programming and Scripting

Deleting all the fields(columns) from a .csv file if all rows in that columns are blanks

Hi Friends, I have come across some files where some of the columns don not have data. Key, Data1,Data2,Data3,Data4,Data5 A,5,6,,10,, A,3,4,,3,, B,1,,4,5,, B,2,,3,4,, If we see the above data on Data5 column do not have any row got filled. So remove only that column(Here Data5) and... (4 Replies)
Discussion started by: ks_reddy
4 Replies

6. Shell Programming and Scripting

Rows into Columns

Input File vCenter Servers: 172.28.173.207: vCenter Server connectivity status: Accessible ESX servers: Name: nyp-vhst1001-at.hq.nt.life.com IP address: 10.34.36.11 Virtual machines: Name:nyp-bbmds-at Ip address: 172.28.173.139 ... (1 Reply)
Discussion started by: greycells
1 Replies

7. Shell Programming and Scripting

rows to columns

Hi Friends, I have a input file as below. how to convert rows to columns? Friday:recharge 3861140 Monday:recharge 4036228 Saturday:recharge 3996376 Sunday:recharge 3777749 Thursday:recharge 3858537 Tuesday:recharge 4047045 Wednesday:recharge 3954798 desinred output Sunday ... (3 Replies)
Discussion started by: suresh3566
3 Replies

8. Shell Programming and Scripting

Rows into columns?

I have a file thats space delimited that looks something like this: Joe Smith jsmith 43234 bill1;bill2;read;read2;schedule Andy Summers asummers 11232 bill1;read Beth McConnel bmconnel 43443 read;read2;schedule;bill Susan Fowler sfowler 09332 bill1;read;schedule I need to... (8 Replies)
Discussion started by: regexnub
8 Replies

9. Shell Programming and Scripting

Columns into rows

Hi, Let me know how to achieve the below requirment Input: ======== BEGIN DSSUBRECORD Name "DOC_NO_2" SqlType "-5" Precision "0" Scale "0" Nullable "0" END DSSUBRECORD BEGIN DSSUBRECORD Name "FROM_LOC" ... (1 Reply)
Discussion started by: Ramya_1104
1 Replies

10. Shell Programming and Scripting

# of rows and columns

Hi, Does anyone know the command to know the # of rows and columns for a file? thanks (3 Replies)
Discussion started by: kylle345
3 Replies
Login or Register to Ask a Question