[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1014
  • Last Modified:

Awk

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
kevinlent
Asked:
kevinlent
  • 2
  • 2
1 Solution
 
tel2Commented:
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
 
kevinlentAuthor Commented:
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
 
kevinlentAuthor Commented:
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
 
tel2Commented:
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

The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now