Solved

Awk

Posted on 2000-02-17
4
979 Views
Last Modified: 2008-02-26
I have a long string of text, for example:

A12345678917/02/00Mr Smith

I need to create an output file with each value on a separate line.  The values are either text, numeric or dates etc and are fixed widths.

I have tried using awk and substr to select the first 10 characters and output on a line, followed by linefeed, then the next 8, then line feed, then next 15 and line feed etc.

Can anyone provide me with an awk script to do this - or an alternative program I can use?

By the way im using GNUs awk on win95 platform.

thanks and regards, kevin
0
Comment
Question by:kevinlent
  • 2
  • 2
4 Comments
 
LVL 12

Accepted Solution

by:
tel2 earned 50 total points
ID: 2530801
kevinlent,

If you've got access to "cut" (comes standard with UNIX), then try this:

  cut -c-8   <infile  >outfile
  cut -c9-16 <infile >>outfile
  cut -c17-  <infile >>outfile

Assuming the data is in a file called infile, and you want the output in outfile.  If you want the output on the screen, omit the ">outfile" and ">>outfile"s.

Let me know how you get on.

What other UNIX utilities have you got in this Win95?
0
 

Author Comment

by:kevinlent
ID: 2530896
Now using right tools for the job, never used cut before, this works a treat!

Thanks very much

You asked what other unix utils I was using: I have a copy of unixdos (downloaded from shareware.com) which includes about 60 of the best unix utils ported for 32bit windows.  I also have GNUs grep/egrep/fgrep, sed, diff and awk utils.

thanks again, kevin
0
 

Author Comment

by:kevinlent
ID: 2530911
Tel2,

Unfortunately cut does a column at a time, not a record at a time.

So cut doesnt do what I had hoped, any more ideas :(
0
 
LVL 12

Expert Comment

by:tel2
ID: 2533471
Sorry Kelvin,

I didn't know your string could be longer than 1 line.  If you have the standard "sed" utility, then you could do this:

Here's a sample infile:
  A12345678917/02/00Mr Smith
  B98765432128/02/01Mrs Smith

And this command:
  cat infile | sed "s/^\(..........\)\(........\)\(.*\)/\1~\2~\3/" | tr "~" "\12"

It gives this output:
  A123456789
  17/02/00
  Mr Smith
  B987654321
  28/02/01
  Mrs Smith

Is that what you want?

Note that this temporarily inserts "~"s in places you will want the line-feeds to be, and then tr converts them to line-feeds.  There might be a way to do this in one step, but I don't know it.
So, the above will not work properly if "~" ever appears in the infile.  In this case, try to change the command to use a character (in place of "~") which WILL never appear in infile.
0

Featured Post

ScreenConnect 6.0 Free Trial

Check out the updates in one game-changing release, ScreenConnect 6.0, based on partner feedback. New features include a redesigned UI that improves session organization and overall user experience. See the enhancements for yourself!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Attention: This article will no longer be maintained. If you have any questions, please feel free to mail me. jgh@FreeBSD.org Please see http://www.freebsd.org/doc/en_US.ISO8859-1/articles/freebsd-update-server/ for the updated article. It is avail…
Installing FreeBSD… FreeBSD is a darling of an operating system. The stability and usability make it a clear choice for servers and desktops (for the cunning). Savvy?  The Ports collection makes available every popular FOSS application and packag…
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.

773 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question