Review your favorite Linux distribution.
Go Back > Forums > Non-*NIX Forums > Programming
User Name
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.


  Search this Thread
Old 10-04-2011, 11:29 AM   #1
Registered: Aug 2011
Distribution: Linux Mint
Posts: 103

Rep: Reputation: Disabled
AWK: delete space between two fields while keep the format for other part

Dear Experts,

I have a file like:
column1   column2 column3      column4 column5
How could I delete the space between column2 and column3(to make them into a single field), while keep the spaces between other columns?

Please pay attention that the number of spaces between other columns are all different. What I need is to keep exactly same format for other parts of the file. That means the number of spaces between other columns should not be changed.

If I simply use:
awk '$2 =$2$3 {print}' FILENAME
I can indeed delete that space but that would destroy the original format, which is not what I am expecting.

So, How to do it easily with AWK?

I would appreciate to your kind help!

Last edited by cristalp; 10-04-2011 at 11:35 AM.
Old 10-04-2011, 12:29 PM   #2
David the H.
Bash Guru
Registered: Jun 2004
Location: Osaka, Japan
Distribution: Debian sid + kde 3.5 & 4.4
Posts: 6,823

Rep: Reputation: 1957Reputation: 1957Reputation: 1957Reputation: 1957Reputation: 1957Reputation: 1957Reputation: 1957Reputation: 1957Reputation: 1957Reputation: 1957Reputation: 1957
awk is possibly not the best tool to use here. Since it's designed for breaking things up into fields, manipulation of the delimiters between the fields is sometimes not so easy to do, particularly when you only want to affect some of them.

I'd use sed in this case, since it targets the line as a whole.
sed -r 's/(^[^[:blank:]]+[[:blank:]]+[^[:blank:]]+)[[:blank:]]+/\1/' infile.txt
This assumes that each field is separated by whitespace. It's a simple regex that matches [linestart][nospaces][whitespace][nospaces][whitespace], and prints all but the last bit of whitespace back into the line, effectively removing that part.

There may be easier ways, but it's the first solution that came to mind.

Edit: D'oh! Just after posting I realized that there is a much easier way.
sed -r 's/[[:blank:]]+//2' infile.txt
The two at the end means the substitution only affects the second match on the line. So we just tell it to match contiguous spans of whitespace, and substitute the second match with nothing.

Last edited by David the H.; 10-04-2011 at 12:40 PM. Reason: as stated


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off

Similar Threads
Thread Thread Starter Forum Replies Last Post
awk question on handling *.CSV "text fields" in awk jschiwal Programming 8 05-27-2010 07:23 AM
[SOLVED] get fields using awk ashok.g Programming 9 12-09-2009 02:21 AM
How can I strip white space from the start and end of fields using awk? jonnymorris Programming 7 10-02-2008 11:52 PM
shell command using awk fields inside awk one71 Programming 6 06-26-2008 05:11 PM
Supressing Fields w/ AWK Rv5 Programming 3 10-19-2004 12:06 PM

All times are GMT -5. The time now is 01:27 AM.

Main Menu
Write for LQ is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration