kevinlent
asked on
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
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
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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 :(
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 :(
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.
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/^\(..........\)\(......
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.
ASKER
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