Pages

Wednesday, February 20, 2013

AWK scripting: 8 AWK printf statements examples

This is our third post on AWK scripting. In this post we will cover printf statement which very much use full for formatting output as the padding spaces before and after the column entries etc. Already covered topics in this series are


printf is similar to AWK print statement but the advantage is that it can print with formatting the output in a desired manner. So before learning printf command I suggest you to learn about print command and then come to this printf statement.

printf syntax is similar to Bash, C type printf statement.

Syntax:

printf format, Arguments

For example you want to print decimal values of column 3 then the example will be.

awk '{printf "%d", $3}' example.txt

Printf can do two things which print command don't

1)Defining type of Data.
2)Padding between columns.

Type of data

printf can be useful when specifying data type such as integer, decimal, octal etc. Below are the list of some data types which are available in AWK.
%i or d --Decimal
%o --Octal
%x --hex
%c --ASCII number character
%s --String
%f --floating number

Note: Make sure that you pass exact data types when using corresponding formats as shown below. If you pass a string to a decimal formatting, it will print just zero instead of that string.

Lets start with some examples. for this post our test file contents are
Jones 21 78 84 77
Gondrol 23 56 58 45
RinRao 25 21 38 37
Edwin 25 87 97 95
Dayan 24 55 30 47

Example 1: Print first column values from db.txt file.

awk '{printf "%s\n", $1}' db.txt

Output:

Jones
Gondrol
RinRao
Edwin
Dayan

Note: printf will not have default new line char, so you have to include tat when ever you execute printf command as shown above.

Example 2: Try printing a string with decimal format and see the difference.

awk '{printf "%d\n", $1}' db.txt

Output:
0
0
0
0
0

So be careful when dealing with different data types.

Padding between columns

Let us explore the formatting the column's available with printf statements.

Types of formatting: We can format the columns to specify number of chars each column can use. We have following padding formats available with printf statement.

-n --Pad n spaces on right hand side of a column.
n --Pad n spaces on left hand side of a column.
.m --Add zeros on left side.
-n.m --Pad n spaces right hand side and add m zeros before that number.
n.m --Pad n spaces left hand side and add m zeros before that.

Let us start exploring above mention padding's with examples in detail.

Example4: Pad 5 spaces on right hand side of each column.

With out padding

awk '{printf "%d%d%d\n", $2,$3,$4}' db.txt

Output
217884
235658
252138
258797
245530

With padding 5 spaces on right hand side:

awk '{printf "%-5d%-5d%-5d\n", $2,$3,$4}' db.txt

Output:
21   78   84
23   56   58
25   21   38
25   87   97
24   55   30
Note: As for understanding purpose we given this example with padding and with out padding. We will add "|" between columnts output so that that padding can be clearly seen as show in below example.

awk '{printf "|%-5d|%-5d|%-5d|\n", $2,$3,$4}' db.txt

Output:

|21   |78   |84   |
|23   |56   |58   |
|25   |21   |38   |
|25   |87   |97   |
|24   |55   |30   |

Example 5: Pad 5 spaces on left hand side of each column.

awk '{printf "|%5d|%5d|%5d|\n", $2,$3,$4}' db.txt

Output:

|   21|   78|   84|
|   23|   56|   58|
|   25|   21|   38|
|   25|   87|   97|
|   24|   55|   30|

Example 6: add zero's on left hand side of each column element make it a 5 digit number.

 awk '{printf "|%.5d|%.5d|%.5d|\n", $2,$3,$4}' db.txt

Output:

|00021|00078|00084|
|00023|00056|00058|
|00025|00021|00038|
|00025|00087|00097|
|00024|00055|00030|

Example 7: Make the column element with 4 digits and 7 in length and print the number to left hand side.


 awk '{printf "|%-7.4d|%-7.4d|%-7.4d|\n", $2,$3,$4}' db.txt

Output:

|0021   |0078   |0084   |
|0023   |0056   |0058   |
|0025   |0021   |0038   |
|0025   |0087   |0097   |
|0024   |0055   |0030   |

Example 8: Make the column element with 4 digits and 7 in length and print the number to right hand side.

awk '{printf "|%7.4d|%7.4d|%7.4d|\n", $2,$3,$4}' db.txt

Output:

|   0021|   0078|   0084|
|   0023|   0056|   0058|
|   0025|   0021|   0038|
|   0025|   0087|   0097|
|   0024|   0055|   0030|

Hope these examples help you to understand about formatting output and padding using printf statement in AWK scripting. Keep visiting scripting.linuxnix.com for more scripting tutorials and tips.

0 comments:

Post a Comment