Visit Our UNIX and Linux User Community


Need to change format of number


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Need to change format of number
# 1  
Old 09-11-2009
Lightbulb Need to change format of number

Hi,

using a shell script to get values from a CSV
eg:

12345.67,5678990.89,76232882.90
12345,5678990.89,76232882


Need the format of these numbers to change to

12,345.67:5,678,990.89:76,232,882.90
12,345:5678990.89:76232882

Using nawk on solaris, to parse these values, need the final data to be presented in the above format.
Smilie
Regards,
pgop
# 2  
Old 09-11-2009
I don't know why you want to do it with awk, I'd prefer doing it with sed:

Code:
sed 's/,/:/g
     :loop
     /[0-9]\{4\}/ {
          s/\([0-9]\)\([0-9]\{3\}[.,:]\)/\1,\2/g
          b loop
     }'

The first line changes the field separator from "," to ":". The following loop searches for 4 consecutive digits and separate the rightmost 3 with a ",". Then the loop is reiterated as long as there are such groups of 4 consecutive digits to split.

I hope this helps.

bakunin
# 3  
Old 09-11-2009
Quote:
Originally Posted by bakunin
I don't know why you want to do it with awk,

Because that's the logical tool to use. One look at the sed code should convince anyone that sed is not the right tool.
Quote:
I'd prefer doing it with sed:

Code:
sed 's/,/:/g
     :loop
     /[0-9]\{4\}/ {
          s/\([0-9]\)\([0-9]\{3\}[.,:]\)/\1,\2/g
          b loop
     }'


For me, that script hangs indefinitely with the given input.


---------- Post updated at 08:03 PM ---------- Previous update was at 07:54 PM ----------

Quote:
Originally Posted by pgop
Hi,

using a shell script to get values from a CSV
eg:

12345.67,5678990.89,76232882.90
12345,5678990.89,76232882


Need the format of these numbers to change to

12,345.67:5,678,990.89:76,232,882.90
12,345:5678990.89:76232882

Using nawk on solaris, to parse these values, need the final data to be presented in the above format.

Why is the transformation different for the second line? Is it supposed to put thousands separators only in the first number of the second line?

Code:
nawk -F, 'BEGIN { OFS = ":" }

function commas(n) {
 if ( n < 1000 ) return n
 gsub(",","",n)
 point = index(n,".") - 1
 if (point < 0) point = length(n)
 while (point > 3) {
         point -= 3
         n = substr(n,1,point) "," substr(n,point + 1)
         }
 return n
}

## PATTERN { $1 = commas( $1 ); next }

{
  for (n = 1; n <= NF; ++n) $n = commas($n)
  print
}'

If some lines are to be treated differently (i.e., only add commas to the furst field), uncomment the PATTERN line and change PATTERN to whatever will catch those lines.
# 4  
Old 09-12-2009
Depending on the locales you have available on your system, you can simply use the printf format %'f to print the thousands grouping character of your liking.

Code:
LANG=en_US.UTF-8 awk -F, -v OFS=":" '{
	for(i=1;i<=NF;i++) {
		l=length($i)
		p=index($i,".")
		d=p?l-p:0;
		$i=sprintf("%'"'"'*.*f",l,d,$i)
	}
	print
}' inputFile



---------- Post updated at 10:39 AM ---------- Previous update was at 10:19 AM ----------

The same on one line:
Code:
LANG=en_US.UTF-8 awk -F, -v OFS=":" '{for(i=1;i<=NF;i++)$i=sprintf("%'"'"'*.*f",length($i),index($i,".")?length($i)-index($i,"."):0,$i)}1' inputFile

# 5  
Old 09-13-2009
How about this one:

Code:
awk -F, 'BEGIN{fmt="%\047.2f"} {
  printf(fmt":"fmt":"fmt"\n",$1,$2,$3)
}' file

This is my output:

Code:
$ cat file
12345.67,5678990.89,76232882.90
12345,5678990.89,76232882
$
$ awk -F, 'BEGIN{fmt="%\047.2f"} {
  printf(fmt":"fmt":"fmt"\n",$1,$2,$3)
}' file
12,345.67:5,678,990.89:76,232,882.90
12,345.00:5,678,990.89:76,232,882.00
$

Regards
# 6  
Old 09-13-2009
Requested output was:
Code:
12,345.67:5,678,990.89:76,232,882.90
12,345:5678990.89:76232882

You are working with a fixed number of decimal for all fields:
Code:
12,345.67:5,678,990.89:76,232,882.90
12,345.00:5,678,990.89:76,232,882.00

Hence the index/length dance in my suggestion.
# 7  
Old 09-13-2009
Quote:
Originally Posted by ripat
Requested output was:
Code:
12,345.67:5,678,990.89:76,232,882.90
12,345:5678990.89:76232882

You are working with a fixed number of decimal for all fields:
Code:
12,345.67:5,678,990.89:76,232,882.90
12,345.00:5,678,990.89:76,232,882.00

Hence the index/length dance in my suggestion.
To present currencies I should prefer my method, but that's the humble opinion of an old bookkeeper..Smilie

Regards

Previous Thread | Next Thread
Test Your Knowledge in Computers #156
Difficulty: Easy
The first two-network TCP/IP communications test was performed between Stanford and University College London, in 1975.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Change name format

I am trying to use either awk or sed to make names like J. A. Smith and J.A. Martin Smith become JA Smith and JA Martin SmithThe code should concatenate abbreviated letters that have a dot after them. I have only been able to do this: echo $name | sed 's/\.\ //g'But that concatenates the... (3 Replies)
Discussion started by: locoroco
3 Replies

2. Shell Programming and Scripting

Format change

I wish to convert the following in shell. Help me SED or AWK ID= 12345,23456,67859 , 90225 , 67583 I can extract the right hand side of "=" using cut command "cut -d "=" -f2 after extracting that right side i would need like this '12345','23456','67859','90225','67583' 1 ) the... (2 Replies)
Discussion started by: ilugopal
2 Replies

3. Shell Programming and Scripting

Change Date Format

Hi Guys, I had a scenario like this.. It seems very silly...dont think it as a home work question.....:) i tried it many ways but i didn't achieve this... start_date=May122011 here i want to change the start_date in to 20110512 start_date=20110512 tell me how can we achive... (5 Replies)
Discussion started by: apple2685
5 Replies

4. Shell Programming and Scripting

Date Format Change

Hi, Please can I have some command to get yesterday in YYMMDD format? This will be used in ksh Thanks, (2 Replies)
Discussion started by: smalya
2 Replies

5. Shell Programming and Scripting

format change

I have a text file sample.txt which contains some details like Order 9001 Item Code 34 Quantity 4 Entry Date 2009-04-23 Ordered by Ram Order 9002 Item Code 34 Quantity 3 (1 Reply)
Discussion started by: lazydev
1 Replies

6. Shell Programming and Scripting

Change date format

Hi guys, I have a text file with lots of lines like this: MCOGT23R27815 27/07/07 27/05/09 SO733AM0235 30/11/07 30/11/10 NL123403N 04/03/08 04/03/11 0747AM7474 04/04/08 04/04/11 I want to change each line so the date format looks like this: MCOGT23R27815 07/07/27 09/05/27 ... (7 Replies)
Discussion started by: Tornado
7 Replies

7. Shell Programming and Scripting

Change of date format

I want to chnage the date format from the file format like below to WT;T15D;0000007208;;20080401;3;0;0;3;;B;ZZZZZZ; WT;T25D;0000007208;;20080401;6;0;0;6;;B;ZZZZZZ; WT;T5D;0000007208;;20080401;123;0;0;123;;B;ZZZZZZ; to WT;T15D;0000007208;;04/01/200804;3;0;0;3;;B;ZZZZZZ;... (2 Replies)
Discussion started by: svenkatareddy
2 Replies

8. UNIX for Advanced & Expert Users

Change date format

I know the command date +"%Y%m%d" can change today's date to digit format as below . $date +"%Y%m%d" 20071217 it works fine . now I want to do it back . If I have a file like below, (in the file , there are three lines, and each line have ; sign , after the ; sign is the date ) , I... (4 Replies)
Discussion started by: ust
4 Replies

9. UNIX for Dummies Questions & Answers

How to change it to the date format

Hi, I want to know how to change this string to date format 20061102122042 to 02-11-2006 12:20:42 or 02-Nov-2006 12:20:42 Please let me know at the earliest.Thanks in advance. Regards, Preetham R. (3 Replies)
Discussion started by: preethgideon
3 Replies

10. Shell Programming and Scripting

change the empty function from the old format to the new format

I have about 300 files which has the function getDBBackend(). How to write a program to change the empty function from the old format to the new format? Old empty function format are either: function getDBBackend() { // Not available } // getDBBackend or: function... (0 Replies)
Discussion started by: powah
0 Replies

Featured Tech Videos