我想将前导0
字符放到某个输入中,从而产生固定长度(由变量给出的长度)。输入可以是数字或字符串
我想在变量中捕获输出。
我试过了:
awk '{j=$(printf "%04d\n"); echo $j}'
但它抛出了这个错误:
awk: line 1: syntax error at or near printf
答案 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"