CodeDevotion
CodeDevotion

Reputation: 307

How to use AWK gsub function to split columns?

How can I use gsub to split a column.?

Below is the sample files where I want to split the second column into two.

> cat seq.txt
Hello/World /app/oracle/data/app4/trail/hb000003
Hello/World /app/oracle/data/app1/trail/gg000028
Hello/World /app/oracle/data/app1/trail/kk000111
Hello/World /app/oracle/data/app1/trail/kk000111
Hello/World /app/oracle/data/app3/trail/mw000021
Hello/World /app/oracle/data/app2/trail/pj000009
Hello/World /app/oracle/data/app1/trail/fx000276
Hello/World /app/oracle/data/app1/trail/fx000006
Hello/World /app/oracle/data/app1/trail/fx000006
Hello/World /app/oracle/data/app1/trail/fx000276
Hello/World /app/oracle/data/app1/trail/gt000005
Hello/World /app/oracle/data/app4/trail/xh000001

Tried something like this.But it seems like gsub doesnt read regex as replacement.

> cat seq.txt | awk -F" " '{gsub(".*/..",".*/.. ",$2)}1'
Hello/World .*/.. 000003
Hello/World .*/.. 000028
Hello/World .*/.. 000111
Hello/World .*/.. 000111
Hello/World .*/.. 000021
Hello/World .*/.. 000009
Hello/World .*/.. 000276
Hello/World .*/.. 000006
Hello/World .*/.. 000006
Hello/World .*/.. 000276
Hello/World .*/.. 000005
Hello/World .*/.. 000001

Below is what am I expecting.

Hello/World /app/oracle/data/app4/trail/hb  000003
Hello/World /app/oracle/data/app1/trail/gg  000028
Hello/World /app/oracle/data/app1/trail/kk  000111
Hello/World /app/oracle/data/app1/trail/kk  000111
Hello/World /app/oracle/data/app3/trail/mw  000021
Hello/World /app/oracle/data/app2/trail/pj  000009
Hello/World /app/oracle/data/app1/trail/fx  000276
Hello/World /app/oracle/data/app1/trail/fx  000006
Hello/World /app/oracle/data/app1/trail/fx  000006
Hello/World /app/oracle/data/app1/trail/fx  000276
Hello/World /app/oracle/data/app1/trail/gt  000005
Hello/World /app/oracle/data/app4/trail/xh  000001

Upvotes: 1

Views: 1004

Answers (3)

Claes Wikner
Claes Wikner

Reputation: 1517

awk '{sub(/000/,"  000")}1' file 
Hello/World /app/oracle/data/app4/trail/hb  000003
Hello/World /app/oracle/data/app1/trail/gg  000028
Hello/World /app/oracle/data/app1/trail/kk  000111
Hello/World /app/oracle/data/app1/trail/kk  000111
Hello/World /app/oracle/data/app3/trail/mw  000021
Hello/World /app/oracle/data/app2/trail/pj  000009
Hello/World /app/oracle/data/app1/trail/fx  000276
Hello/World /app/oracle/data/app1/trail/fx  000006
Hello/World /app/oracle/data/app1/trail/fx  000006
Hello/World /app/oracle/data/app1/trail/fx  000276
Hello/World /app/oracle/data/app1/trail/gt  000005
Hello/World /app/oracle/data/app4/trail/xh  000001

Upvotes: 0

karakfa
karakfa

Reputation: 67507

With gawk's gensub

$ awk '{$2=gensub(/(\/..)([^/]+)$/,"\\1  \\2",1,$2)}1' file

Hello/World /app/oracle/data/app4/trail/hb  000003
Hello/World /app/oracle/data/app1/trail/gg  000028
Hello/World /app/oracle/data/app1/trail/kk  000111
Hello/World /app/oracle/data/app1/trail/kk  000111
Hello/World /app/oracle/data/app3/trail/mw  000021
Hello/World /app/oracle/data/app2/trail/pj  000009
Hello/World /app/oracle/data/app1/trail/fx  000276
Hello/World /app/oracle/data/app1/trail/fx  000006
Hello/World /app/oracle/data/app1/trail/fx  000006
Hello/World /app/oracle/data/app1/trail/fx  000276
Hello/World /app/oracle/data/app1/trail/gt  000005
Hello/World /app/oracle/data/app4/trail/xh  000001

Upvotes: 1

Etan Reisner
Etan Reisner

Reputation: 81002

Of course replacements don't take regular expressions. That wouldn't be useful. What would they match against? What you want are captures from the pattern.

The character & in the replacement means the entire text that was matched so what you want is:

awk -F " " '{gsub(".*/..", "& ", $2)}7'

Upvotes: 4

Related Questions