使用printf格式的变量

时间:2014-08-20 14:37:04

标签: awk printf awk-formatting

假设我有这样的文件:

$ cat a
hello this is a sentence
and this is another one

我想打印前两列,并在它们之间加上一些填充。由于此填充可能会更改,我可以使用7

$ awk '{printf "%7-s%s\n", $1, $2}' a
hello  this
and    this

17

$ awk '{printf "%17-s%s\n", $1, $2}' a
hello            this
and              this

25,或......您明白了这一点:数字可能会有所不同。

然后弹出一个问题:是否可以为此N分配变量,而不是以%N-s格式对整数进行硬编码?

我尝试了这些事情没有成功:

$ awk '{n=7; printf "%{n}-s%s\n", $1, $2}' a
%{n}-shello
%{n}-sand

$ awk '{n=7; printf "%n-s%s\n", $1, $2}' a
%n-shello
%n-sand

理想情况下,我想知道是否可以这样做。如果不是,那么最好的解决方法是什么?

4 个答案:

答案 0 :(得分:17)

如果在格式字符串中使用*,则会从参数

中获取一个数字
awk '{printf "%*-s%s\n", 17, $1, $2}' file
hello            this
and              this

awk '{printf "%*-s%s\n", 7, $1, $2}' file
hello  this
and    this

正如The GNU Awk User’s Guide #5.5.3 Modifiers for printf Formats中所述:

  

C库printf的动态宽度和预处理能力(例如,   "%*。* s")受支持。而不是提供明确的宽度和/或prec   格式字符串中的值,它们在参数列表中传递。对于   例如:

w = 5
p = 3
s = "abcdefg"
printf "%*.*s\n", w, p, s
  

完全等同于:

s = "abcdefg"
printf "%5.3s\n", s

答案 1 :(得分:3)

使用简单的字符串连接。

此处"%"n"-s%s\n"连接为格式的单个字符串。根据以下示例,生成的格式字符串为%7-s%s\n

awk -v n=7 '{ printf "%" n "-s%s\n", $1, $2}' file
awk '{ n = 7; printf "%" n "-s%s\n", $1, $2}' file

输出:

hello  this
and    this

答案 2 :(得分:3)

这算得上吗?

想法是构建用于fmt的“动态”printf

kent$   awk '{n=7;fmt="%"n"-s%s\n"; printf fmt, $1, $2}' f 
hello  this
and    this

答案 3 :(得分:-1)

你可以使用eval(也许不是所有转义符号中最漂亮的,但它有效)

i=15
eval "awk '{printf \"%$i-s%s\\n\", \$1, \$2}' a"

输出:

hello          this
and            this