Reputation: 307
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
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
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
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