假设我有这样的文件:
$ 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
理想情况下,我想知道是否可以这样做。如果不是,那么最好的解决方法是什么?
答案 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