This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
commands:builtin:printf [2015/10/19 08:55]
privatesniper Fix symantics in code example, surname is last name, so renamed second variable to firstname.
commands:builtin:printf [2016/11/30 15:39] (current)
medievalist [differences from awk printf]
Line 277: Line 277:
 Please read the manpage of ''​strftime(3)''​ to get more information about the supported formats. Please read the manpage of ''​strftime(3)''​ to get more information about the supported formats.
-==== Using printf inside of awk ====+===== differences from awk printf =====
-Here'​s ​the gotcha:+Awk also derives its //​printf()//​ function from C, and therefore has similar format specifiers. ​ However, in all versions of awk the space character is used as a string concatenation operator, so it cannot be used as an argument separator. ​ **Arguments to awk printf must be separated by commas.** ​ Some versions of awk do not require printf arguments to be surrounded by parentheses,​ but you should use them anyway to provide portability. 
 +In the following example, the two strings are concatenated by the intervening space so that no argument remains to fill the format.
 <​code>​ <​code>​
-$ printf "​%s\n"​ "​Foo"​ 
 $ echo "​Foo"​ | awk '{ printf "​%s\n"​ $1 }' $ echo "​Foo"​ | awk '{ printf "​%s\n"​ $1 }'
Line 294: Line 293:
 </​code>​ </​code>​
-One fix is to use commas to separate ​the format from the arguments:+Simply replacing ​the space with a comma and adding parentheses yields correct awk syntax.
 <​code>​ <​code>​
-$ echo "​Foo"​ | awk '{ printf "​%s\n",​ $1 }'+$ echo "​Foo"​ | awk '{ printf"​%s\n",​ $1 }'
 Foo Foo
 </​code>​ </​code>​
-Or, use **printf** ​the way that awk wants you to:+With appropriate metacharacter escaping ​the bash printf can be called from inside ​awk (as from perl and other languages that support shell callout) as long as you don't care about program efficiency or readability.
 <​code>​ <​code>​
-echo "​Foo"​ | awk '{ printf $1 "\n" }'+echo "​Foo"​ | awk '​{ ​system( "printf ​\"​%s\\n \" \"" ​$1 "​\"​" ​ ) }'
 Foo Foo
 </​code>​ </​code>​
-But then you lose the ability to pad numbers, set field widths, etc. that **printf** has. 
 ===== Differences from C, and portability considerations ===== ===== Differences from C, and portability considerations =====
  • commands/builtin/printf.1445244928.txt
  • Last modified: 2015/10/19 08:55
  • by privatesniper