Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1013
  • 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

Vote for the Most Valuable Expert

It’s time to recognize experts that go above and beyond with helpful solutions and engagement on site. Choose from the top experts in the Hall of Fame or on the right rail of your favorite topic page. Look for the blue “Nominate” button on their profile to vote.

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