printf in awk


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting printf in awk
# 1  
Old 04-01-2009
printf in awk

Hi friends..

I am confused about awk printf option..

I have a comma separated file

88562848,21-JAN-08,2741079, -1188,-7433,TESTING
88558314,21-JAN-08,2741189, -1273,-7976,TESTING

and there is a line in my script ( written by someone else)

Quote:
cat (the above csv file) | awk -F, '{printf("%i,%s,%s,%i,%i\n",$1,$2,$3,$4,$5)}' | grep -v '0,,0,0,0,,'

What is the use of command?
I guess %i is for integer and %s for - ? is it char or something?

apart from this..

I have to modify this script to deal with a semicolon separated file..(also includes comma in 4th and 5th place)

T900001;10-Dec-08;T245377;2,25;14,09;CM Inv;1001
900234;10-Jan-08;954201;0,44;2,78;CM Inv;1001


I tried substituting the above awk syntax with "," replaced by ";" but it doesnt work. it is giving me a awk syntax error.


Please help.
# 2  
Old 04-01-2009

Did you remember to quote or escape the semi-colon?

Code:
awk -F\; '.....' FILE | grep ... ## No need for cat

# 3  
Old 04-01-2009
Yes, %i (and %d) are numeric. %s is character string (whereas %c is a single character).

What this is doing is inputing the csv file (separated by comma) and outputting all but the last field (TESTING) pretty much the same and the grep is saying EXCLUDE (dash-v) lines that have essentially null values across the record. I'm guessing the null values in the records might inconsistant lengths which is why he needs to force the format prior to the grep -v. In other words, these are both null but would require different greps:
Code:
00000000,, , 0, 0,TESTING
0,           ,,0000,0,TESTING

... with the awk printf, they would both have the format '0,,0,0,0,,' though.

As cfa said, you need to escape the semi-colon because it's a control character like pipe, tick, etc.
# 4  
Old 04-01-2009
Regarding the rest of your question, if it's always the case that you wish the commas were semi-colons in your new file, you could translate prior to your awk:
Code:
 tr ',' ';' <csvfile | awk -F\; '{ ... }'

Keep in mind now your field 4 will be 4&5 and your field 5 will be 6&7 and on down the line. Here's your data and field numbers now:
Code:
/msa1/profiles/mlibby/ksh> tr ',' ';' <malt | awk -F\; '{for(i=1;i<=NF;++i) print "Fld",i,$i}'
Fld 1 T900001
Fld 2 10-Dec-08
Fld 3 T245377
Fld 4 2
Fld 5 25
Fld 6 14
Fld 7 09
Fld 8 CM Inv
Fld 9 1001
Fld 1 900234
Fld 2 10-Jan-08
Fld 3 954201
Fld 4 0
Fld 5 44
Fld 6 2
Fld 7 78
Fld 8 CM Inv
Fld 9 1001

If you don't want to unilaterally translate, i.e., some OTHER fields might have imbedded commas that you don't want to translate to semicolon, use the split feature on fields 4 & 5 like so:
Code:
/msa1/profiles/mlibby/ksh> r
awk -F\; '{split($4,z,",");split($5,y,",");printf "%i,%s,%s,%i,%i,%i,%i,%s,%i\n",$1,$2,$3,z[1],z[2],y[1],y[2],$6,$7}' csvfile | grep -v '0,,,0,0,0,0,,0'
0,10-Dec-08,T245377,2,25,14,9,CM Inv,1001
900234,10-Jan-08,954201,0,44,2,78,CM Inv,1001

# 5  
Old 04-02-2009
Hi All,

Thank you very much for your explaination.

@marcus121 : This is pretty clear now. just one point..

Quote:
awk -F, '{printf("%i,%s,%s,%i,%i\n",$1,$2,$3,$4,$5)}' filename | grep -v '0,,0,0,0,,'
It is clear that above will print only 5 fields ( exclude TESTING
i.e

Quote:
88562848,21-JAN-08,2741079, -1188,-7433,TESTING
88558314,21-JAN-08,2741189, -1273,-7976,TESTING
now grep -v '0,,0,0,0,,' , I guess pointing to -
1 st field - 0
2nd - null
3rd, 4th, 5th - 0
6 th - null ..

but in the resulting file, there will be no 6th field (TESTING) !!. then for what purpose, the last 2 commas are there in grep?


also, regarding the comma in 5th and 6th field in the new file..
my requirement is..

instead of 2,25 i want to print (2*100)+25 i.e 225
in general, 4th and 5th field, i want the below value

(value_before_comma*100)+value_after_comma

though I am working on it.. trying like $4*=100 but I am having problem in splitting both values for doing different calulation
I appreciate if i can get some clue.

Thanks.
# 6  
Old 04-02-2009
Quote:
tr ',' ';' <filename | awk -F\; '{print $1","$2","$3","$4","$5","$6","$7","$8","$9}'|awk -F, '{$4*=100;$6*=100;$4=$4+$5;$6=$6+$7;print $1","$2","$3","$4","$6}'
This is what i tried..

Is that a right way of achieving this...

Thanks in advance.
# 7  
Old 04-02-2009
Quote:
Originally Posted by anchal_khare
This is what i tried..

Is that a right way of achieving this...

Thanks in advance.

Hey can you explain your requirement clearly.
Do you will have two different files one comma seperated and other ; seperated.

Or you want to create ; seperated from , separetaed and then do transformations
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk printf dillemma

Please help me format this file: Source file looks like this, there are three columns, separated by space. First column has varrying width: 1 248105240 W25_2013 10 248103710 W06_2013 100 248103710 W06_2013 1000 248103710 W06_2013 I need to transform the file into a fixed width per column.... (1 Reply)
Discussion started by: tamahomekarasu
1 Replies

2. Shell Programming and Scripting

Use of awk and printf - help needed

I have a very large file with more than 500,000 lines of dated events. The first field contains the date/time in the following format: 20120727-files.files:20120727090044 where the first 8 numbers represent yyyymmdd. The last set of numbers represent yyyy/mm/dd/hh:mm:ss I would like to... (4 Replies)
Discussion started by: LDHB2012
4 Replies

3. Shell Programming and Scripting

printf format with awk

Hello Here is an easy one Data file 12345 (tab) Some text (tab) 53.432 23456 (tab) Some longer text (tab) 933.422 34567 (tab) Some different text (tab) 29.309 I need to awk these three tab-delimited columns so that the first two are unchanged (unformatted) and the third shows two decimal... (1 Reply)
Discussion started by: palex
1 Replies

4. Shell Programming and Scripting

awk with printf

Hi, I am using the following code to assign a count value to a variable. But I get nothing. Do you see anything wrong here. I am new to all this. $CTR=`remsh $m -l $MACHINES{$m} -n cat $output | grep -v sent | grep \"$input\" | sort -u | awk '{print $5}'`; Upto sort - u it's... (2 Replies)
Discussion started by: nurani
2 Replies

5. Shell Programming and Scripting

AWK printf help

Target file contains short text (never more than 1 line) and filenames. The format is, e.g.,: TEXT1 filename1 TEXT2 TEXT3 filename3dddd filename3dddd TEXT4 filename4 TEXT5 filename5dddd filename5dddd filename5 where dddd is a random 4-digit whole number. Desired output: (4 Replies)
Discussion started by: uiop44
4 Replies

6. Shell Programming and Scripting

IF and awk/printf

Hi Friends, Scripting newb here. So I'm trying to create a geektool script that uses awk and printf to output certain fields from top (namely command, cpu%, rsize, pid and time, in that order). After much trial and error, I've pretty much succeeded, with one exception. Any process whose name... (3 Replies)
Discussion started by: thom.mattson
3 Replies

7. Shell Programming and Scripting

awk and printf

echo $bbsize 1.5 echo $fillpercent .95 echo $bbsize | awk '{printf "%.2f\n",$0*$fillpercent}' 2.25 echo $bbsize | awk '{printf "%.2f\n",$0*.95}' 1.42 1.42 is what I'm expecting... echo $blocksize 4096 echo $bbsize | awk '{printf "%.2f\n",$0*$blocksize}' 2.25 echo $bbsize |... (3 Replies)
Discussion started by: xgringo
3 Replies

8. Shell Programming and Scripting

Awk printf problem

Hi, I've got a basic problem using printf statement in awk. I want to write float values with always 8 characters width. Examples : 1.345678 12.45678 123.4567 1234.678 -23.5678 -2.45678 -23456.8 ..... I cannot find the right printf format %8.1f, %7.5f.... Can anyone help ?... (4 Replies)
Discussion started by: cazhot
4 Replies

9. UNIX for Dummies Questions & Answers

AwK printf question

Hi, Does anyone know a easy way to printf $3,$4, ... all the way to the last field in the file? I will need to modify $1 and $2 and then printf modified $1 and $2 and the rest of the fields(which are not changed). I know I can use NF as the total number of field. Do I use a for next statement to... (4 Replies)
Discussion started by: whatisthis
4 Replies

10. UNIX for Advanced & Expert Users

awk printf problem

Hi Friends, Can anyone guide me how to compute sum of column4 from the below file x using awk command? when i do using awk I'm getting sum 7482350198352648.000000 which is not accurate. $ cat x 56,232,dfgjkhdfj,,56,anand 56,22,dfgjkhdfj,7482347823453123.97834 ,56,Khan 56,23,dfgjkhdfj, ... (6 Replies)
Discussion started by: krishna
6 Replies
Login or Register to Ask a Question