Help using sed or awk for file edit

Can I ask for some help editting a file using sed or awk?

I have a pipe delimited file with 30 fields per record.

The 30th field contains numbers.

I want to find all the 12 digit numbers that start with a 7, and change them to eleven digit numbers.  Basically I need to remove the leading 7 from the 12 digit numbers so I am left with a 11 digit number in that field.
rooneAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Kent OlsenDBACommented:
Hello roone,

There are several ways to do this.  The easiest sed solution is to assume that the last field is being edited.

Change the ',' to the correct separator, if necessary.  This solution requires that there are no null fields (there are no consecutive separators).


sed 's/,7[0-9]\{11\}$/,&/; s/,,7/,/' myfile

Good Luck,
Kent
0
rooneAuthor Commented:
The records are separated by |

OK.
Thanks.
0
Kent OlsenDBACommented:

Make sure to escape the '|' character.   :)

sed 's/\|7[0-9]\{11\}$/\|&/; s/\|\|7/\|/' myfile


0
Learn Ruby Fundamentals

This course will introduce you to Ruby, as well as teach you about classes, methods, variables, data structures, loops, enumerable methods, and finishing touches.

rooneAuthor Commented:
# cat testsed
s/|7[0-9]\{11\}$/|&/; s/||7/|/
#

I made this sed file.  I used it on a test file, and it just removed the numbers starting with 7.

Can you break down the actual expression for me?

I understand the first part "search for a pipe followed by a seven and then 11 other digits"
s/|7[0-9]\{11\}
, right?

But I get lost after the $
0
rooneAuthor Commented:
Oh, wait.  There are consecutive separators.

But I am definately only touching the last field.

Can't I say, grab the 30th field and then do this substitution?

0
rooneAuthor Commented:
# cat trythis
s/\(7\)\([0-9]\{11\}\)/\2/g


This worked for me.

Thanks.


0
Kent OlsenDBACommented:
Hi roone,

You can certainly grab the 30th something.  The script that I provided grabbed the last field, which happens to be the 30th.  :)

I don't know your data very well, but your script doesn't care where the 7........... entry is.  And will change ALL occurences, not just parameter 30.


Kent
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
rooneAuthor Commented:
Understood.  Thanks for the help.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Unix OS

From novice to tech pro — start learning today.