Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP id AA321 ; Sun, 31 Jan 93 14:02:57 EST Xref: sserve comp.unix.bsd:10628 comp.unix.misc:6305 comp.unix.shell:7582 comp.unix.questions:30753 Path: sserve!manuel.anu.edu.au!munnari.oz.au!spool.mu.edu!uunet!lhdsy1!nntpserver.chevron.com!gruc19.nor.chevron.com!hjiwa From: hjiwa@gruc19.nor.chevron.com (Jeff Wang) Newsgroups: comp.unix.bsd,comp.unix.misc,comp.unix.shell,comp.unix.questions Subject: Re: Rotating a file (row <-> columns). HELP WANTED Message-ID: <1993Jan30.150622@gruc19.nor.chevron.com> Date: 29 Jan 93 21:06:22 GMT References: <C1IxwG.2FM@inews.Intel.COM> Sender: news@nntpserver.chevron.com (USENET News System) Organization: Chevron Petroleum Technology Company Lines: 83 vdalvi@mcd.intel.com (Vishram Dalvi ~) writes: |> Hi Netters, |> I am sure that this problem must have been asked before and |> that some one may already have a solution to it. I have a file which |> has a whole bunch of names listed in successive columns. I want to |> be able to read them serially. All the names are not the same length |> and may be separated by one or more spaces. Currently I am turning |> the file around by cutting successive columns and then using "echo -n" |> for each entry in that columns. This is ssssllloooww :-( Does the file |> HAVE to be turned around to retrieve the names ? Can it be speeded up |> some way or avoided altogether ? (short of not running the program :-) ) |> Here is what the input looks like: |> |> c |> o c c |> c c l o o c |> o o u l l o |> l l m u u l |> u u n m m u |> m m t n n m |> n n h f f n |> o t r o i s |> n w e u v i |> e o e r e x |> |> I want to turn it into: |> |> columnone |> columntwo |> columnthree |> columnfour |> columnfive |> columnsix Here's a little awk script that rotates rows and columns and transposes a matrix of values that are delimited by spaces... R1C1 R1C2 R1C3 R2C1 R2C2 R2C3 R3C1 R3C2 R3C3 R4C1 R4C2 R4C3 becomes - R1C1 R2C1 R3C1 R4C1 R1C2 R2C2 R3C2 R4C2 R1C3 R2C3 R3C3 R4C3 --------------------CUT-HERE-------------------- #!/bin/sh5 ## TRANSPOSE A MATRIX ## ASSUMES ALL LINES HAVE THE SAME NUMBER OF FIELDS ## USAGE : transpose file # exec awk ' NR == 1 { n = NF for (i = 1; i <= NF; i++) row[i] = $i next } { if (NF > n) n = NF for (i = 1; i <= n; i++) row[i] = row[i] " " $i } END { for (i = 1; i <= n; i++) print row[i] }' ${1+"$@"} --------------------CUT-HERE-------------------- Hope that helps. -- #====}==) #===(==} #====}==) #===(==} {==)===# (=={====# {==)===# (=={====# >> Jeff Wang Net : hjiwa@gruc19.nor.chevron.com << >> Chevron Petroleum Technology Company Profs : hjiwa (hovmb) << >> Geophysical/Geological Applications Phone : (504) 592-6162 << >> 935 Gravier Street, Room 1006 Fax : (504) 592-6958 << >> New Orleans, Louisiana 70112 Valeo,vales. Die dulci fruimini!! :) << #===(==} What if no one ever asked a hypothetical question? {==)===#