在awk命令中将printf输出分配给变量

时间:2018-02-23 17:13:07

标签: unix

我想将前导0字符放到某个输入中,从而产生固定长度(由变量给出的长度)。输入可以是数字或字符串 我想在变量中捕获输出。

我试过了:

awk '{j=$(printf "%04d\n"); echo $j}'  

但它抛出了这个错误:

awk: line 1: syntax error at or near printf

2 个答案:

答案 0 :(得分:0)

使用

 awk '{j=sprintf("%04d", NR); print j}' 

将记录号放在变量j中。

答案 1 :(得分:0)

如果要使用w打印数字n宽度总计,可以使用

n=12
w=8
printf "%0*d\n" $w $n

如果想要将结果放在var中,可以使用

printf -v j "%0*d" $w $n
echo "j=[$j]"
# Result:
j=[00000012]

当你想要支持字符串时,它会变得更加复杂。 一个简单的补丁似乎有效

s="Hello"
w=8
# Wrong:
printf "%*s\n" $w "$s" | tr ' ' '0'

此解决方案的问题在于它还将替换$s中的空格。您可以使用sed构造:

s="Hello World with Spaces"
w=40
printf "%*s\n" $w "$s"| sed -r ':a;s/^( *) /\10/;ta'
j=$(printf "%*s" $w "$s"| sed -r ':a;s/^( *) /\10/;ta')

sed构造将遍历输入,每次用0替换一个空格(最后一个前导空格)。 \1将放回其他前导空格 当难以理解时,看看如何用'x'替换2个空格:

printf "%*s\n" $w "$s"| sed -r 's/^( *) /\1x/;s/^( *) /\1x/'
编辑:解决方案并不完美。当输入字符串以空格开头时,这些空格也会被零替换,这可能不是所希望的行为:s=" I started with a space"

解决方案似乎是首先计算零的数量:总宽度$w减去stringlength ${#s}。当您至少需要一个0时,可以使用

printf "%0*d%s\n" $(($w - ${#s})) 0 "$s"