Combining gsub and substr in awk


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Combining gsub and substr in awk
# 1  
Old 11-17-2010
Combining gsub and substr in awk

I have data a.txt:
Quote:
123456701234567890abcdefghijklmnopqrsccyy-mm-dd0000000001Pccyy-mm-ddABCDEFGH
123456701234567890abcdefghijklmnopqrsccyy-mm-dd0000000009Pccyy-mm-ddABCDEFGH
123456701234567890abcdefghijklmnopqrsccyy-mm-dd0000000050Pccyy-mm-ddABCDEFGH
I want to reformat file to look like this:

Quote:
1234567|01234567890abcdefghijklmnopqrs|1|ccyymmdd|
1234567|01234567890abcdefghijklmnopqrs|9|ccyymmdd|
1234567|01234567890abcdefghijklmnopqrs|50|ccyymmdd|
basically with the 3rd columns having leading zeros removed.

My code a.awk:

Code:
awk '{ v=substr($0, 48,10); print substr($0,1,7)"|"substr($0,8,30)"|"gsub("0*","
",v)"|"substr($0,59,4)substr($0,64,2)substr($0,67,2)"|"}' a.txt

always returns '2' in the third column and I'm wondering why and how i can strip out the leading zeroes while awk'ing:

Quote:
1234567|01234567890abcdefghijklmnopqrs|2|ccyymmdd|
1234567|01234567890abcdefghijklmnopqrs|2|ccyymmdd|
1234567|01234567890abcdefghijklmnopqrs|2|ccyymmdd|
I'm trying to avoid doing another while read file just to make that substitution.
I would use 'bc" if it is possible.

Thanks.
Gianni
# 2  
Old 11-17-2010
gsub dosn't return a string result, it updates variable in place so do gsub on your variable before the print.

Code:
awk '{ v=substr($0, 48,10); gsub("^0*","",v);
print substr($0,1,7)"|"substr($0,8,30)"|"v"|"substr($0,59,4)substr($0,64,2)substr($0,67,2)"|"}' a.txt

This User Gave Thanks to Chubler_XL For This Post:
# 3  
Old 11-17-2010
Code:
$ awk '{ v=substr($0, 48,10); gsub("^0*","",v); print substr($0,1,7)"|"substr($0,8,30)"|" v "|"substr($0,59,4)substr($0,64,2)substr($0,67,2)"|"}' file 
1234567|01234567890abcdefghijklmnopqrs|1|ccyymmdd|
1234567|01234567890abcdefghijklmnopqrs|9|ccyymmdd|
1234567|01234567890abcdefghijklmnopqrs|50|ccyymmdd|
$ awk '{ print substr($0,1,7)"|"substr($0,8,30)"|" int(substr($0, 48,10)) "|"substr($0,59,4)substr($0,64,2)substr($0,67,2)"|"}' file
1234567|01234567890abcdefghijklmnopqrs|1|ccyymmdd|
1234567|01234567890abcdefghijklmnopqrs|9|ccyymmdd|
1234567|01234567890abcdefghijklmnopqrs|50|ccyymmdd|

This User Gave Thanks to anbu23 For This Post:
# 4  
Old 11-17-2010
Code:
sed 's:0:|0:;s:ccyy-mm-dd0*:|:;s:P:|:;s:-::g;s:[A-Z]*$:|:' a.txt

Code:
$ cat a.txt
123456701234567890abcdefghijklmnopqrsccyy-mm-dd0000000001Pccyy-mm-ddABCDEFGH
123456701234567890abcdefghijklmnopqrsccyy-mm-dd0000000009Pccyy-mm-ddABCDEFGH
123456701234567890abcdefghijklmnopqrsccyy-mm-dd0000000050Pccyy-mm-ddABCDEFGH
$ sed 's:0:|0:;s:ccyy-mm-dd0*:|:;s:P:|:;s:-::g;s:[A-Z]*$:|:' a.txt
1234567|01234567890abcdefghijklmnopqrs|1|ccyymmdd|
1234567|01234567890abcdefghijklmnopqrs|9|ccyymmdd|
1234567|01234567890abcdefghijklmnopqrs|50|ccyymmdd|
$


Last edited by ctsgnb; 11-17-2010 at 03:45 PM..
This User Gave Thanks to ctsgnb For This Post:
# 5  
Old 11-17-2010
Code:
awk '{ v=substr($0, 48,10)+0; print substr($0,1,7),substr($0,8,30),v,substr($0,59,4)substr($0,64,2)substr($0,67,2)OFS}' OFS='|' a.txt


Last edited by vgersh99; 11-17-2010 at 03:44 PM..
This User Gave Thanks to vgersh99 For This Post:
# 6  
Old 11-17-2010
Wow. Thank you so much everyone!! I like the +0 solution for it's simplicity.

-Gianni
# 7  
Old 11-17-2010
Code:
sed 's/\(.\{7\}\)\(.\{30\}\).*00*\(.*\)P\(....\)-\(..\)-\(..\).*/\1|\2|\3|\4\5\6|/' file

GNU sed:
Code:
sed -r 's/(.{7})(.{30}).*00*(.*)P(....)-(..)-(..).*/\1|\2|\3|\4\5\6|/' file

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Gsub function in awk

Hello, I had some difficulty to understand the gsub function and maybe the regex in this script to remove all the punctuations: awk 'gsub(//, " ", $0)' text.txtFile text.txt: This is a test for gsub I typed this random text file which contains punctuation like ,.;!'"?/\ etc. The script... (6 Replies)
Discussion started by: yifangt
6 Replies

2. UNIX for Dummies Questions & Answers

awk gsub with variables

Hello, I'm trying to substitute a string with leading zero for all the records except the trailer record using awk command and with variables. The input file test_med1.txt has data like below 1234ABC...........................9200............LF... (2 Replies)
Discussion started by: somu_june
2 Replies

3. Shell Programming and Scripting

awk gsub

Hi, I want to print the first column with original value and without any double quotes The output should look like <original column>|<column without quotes> $ cat a.txt "20121023","19301229712","100397" "20121023","19361629712","100778" "20121030A","19361630412","100838"... (3 Replies)
Discussion started by: ysrini
3 Replies

4. Shell Programming and Scripting

Awk; gsub in fields 3 and 4

I want to transform a log file into input for a database. Here's the log file: Tue Aug 4 20:17:01 PDT 2009 Wireless users: 339 Daily Average: 48.4285 = Tue Aug 11 20:17:01 PDT 2009 Wireless users: 295 Daily Average: 42.1428 = Tue Aug 18 20:17:01 PDT 2009 Wireless users: 294 Daily... (6 Replies)
Discussion started by: Bubnoff
6 Replies

5. Shell Programming and Scripting

Help with awk and gsub using C shell

Being new to awk, I am still running into little stupid things. For this issues I am trying to search for all occurrences of a string in a file and replace all of those occurrences with a replacement string. I tried doing awk '{gsub("|750101|", "|000000|", $0)}' infile > outfile Unix... (3 Replies)
Discussion started by: jclanc8
3 Replies

6. Shell Programming and Scripting

Awk gsub error.

I want to replace comma with space and "*646#" with space. I am using the following code: nawk -F"|" '{gsub(","," ",$3); gsub(/\*646\#/"," ",$3);print}' OFS="|" file I am getting following error: Help is appreciated (5 Replies)
Discussion started by: pinnacle
5 Replies

7. Shell Programming and Scripting

Awk Gsub Query

Hi, Can some one please explain the following line please throw some light on the ones marked in red awk '{print $9}' ${FTP_LOG} | awk -v start=${START_DATE} 'BEGIN { FS = "." } { old_line1=$0; gsub(/\-/,""); if ( $3 >= start ) print old_line1 }' | awk -v end=${END_DATE} 'BEGIN { FS="." } {... (3 Replies)
Discussion started by: crosairs
3 Replies

8. Shell Programming and Scripting

awk gsub

Hi all I want to do a simple substitution in awk but I am getting unexpected output. My function accepts a time and then prints out a validation message if the time is valid. However some times may include a : and i want to strip this out if it exists before i get to the validation. I have shown... (4 Replies)
Discussion started by: pxy2d1
4 Replies

9. Shell Programming and Scripting

Help with AWK and gsub

Hello, I have a variable that displays the following results from a JVM.... 1602100K->1578435K I would like to collect the value of 1578435 which is the value after a garbage collection. I've tried the following command but it looks like I can't get the > to work. Any suggestions as... (4 Replies)
Discussion started by: npolite
4 Replies

10. Shell Programming and Scripting

use var in gsub of awk

Hi all, This problem has cost me half a day, and i still do not know how to do. Any help will be appreciated. Thanks advance. I want to use a variable as the first parameters of gsub function of awk. Example: { ... arri]=gsub(i,tolower(i),$1) (which should be ambraced by //) ... } (1 Reply)
Discussion started by: summer_cherry
1 Replies
Login or Register to Ask a Question