Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 将printf输出分配给awk命令中的变量_Unix - Fatal编程技术网

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

Unix 将printf输出分配给awk命令中的变量,unix,Unix,我想把前导0字符放到一些输入中,从而得到一个固定长度(由变量给出的长度)。输入可以是数字或字符串。 我想在变量中捕捉输出 我试过这个: awk '{j=$(printf "%04d\n"); echo $j}' 但它抛出了这个错误: awk: line 1: syntax error at or near printf 使用 要将记录编号放入变量j.中,当您要用w打印数字n宽度总计时,您可以使用 n=12 w=8 printf "%0*d\n" $w $n printf -v j "%

我想把前导
0
字符放到一些输入中,从而得到一个固定长度(由变量给出的长度)。输入可以是数字或字符串。
我想在变量中捕捉输出

我试过这个:

awk '{j=$(printf "%04d\n"); echo $j}'  
但它抛出了这个错误:

awk: line 1: syntax error at or near printf
使用


要将记录编号放入变量j.

中,当您要用w打印数字n宽度总计时,您可以使用

n=12
w=8
printf "%0*d\n" $w $n
printf -v j "%0*d" $w $n
echo "j=[$j]"
# Result:
j=[00000012]
printf "%0*d%s\n" $(($w - ${#s})) 0 "$s"
当您希望在var中得到结果时,可以使用

n=12
w=8
printf "%0*d\n" $w $n
printf -v j "%0*d" $w $n
echo "j=[$j]"
# Result:
j=[00000012]
printf "%0*d%s\n" $(($w - ${#s})) 0 "$s"
当您想要同时支持字符串时,它会变得更加复杂。 一个简单的补丁似乎可以工作

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/'
编辑:解决方案并不完美。当inputstring以空格开头时,这些空格也会被零替换,这可能不是理想的行为:
s=“我以空格开头”

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

n=12
w=8
printf "%0*d\n" $w $n
printf -v j "%0*d" $w $n
echo "j=[$j]"
# Result:
j=[00000012]
printf "%0*d%s\n" $(($w - ${#s})) 0 "$s"

awk有一个sprintf函数在awk中为变量赋值的语法是什么?awk'{j=$(printf“%04d\n”);echo$j}'也许可以将问题的标题改为“如何将字符串格式化为具有前导字符的固定长度”awk'{j=$(sprintf“%04d\n”);echo$j}'awk:第1行:在%04D处或附近出现语法错误您需要该格式字符串的参数。你想打什么号码?此外,换行符是多余的,因为
print
语句将添加一个。我将编辑答案以将记录编号放入变量中。需要在awk中指定类似于j=“0000”的内容,其中零的数量不是硬编码的。因此,我尝试使用j=$(sprintf“%04d\n”),其中值4或任何数字将通过一个变量,听起来像是您想要的
j=sprintf(“%04d”,0)
。或者,如果4是一个变量,例如:“代码> ECHO Foo.AWK”{j=SaveTFF(“% 0”n“D”,0);如果没有字母数,如N=ABC123,则需要将j输出替换为[100ABC123]替换字符串,如果在字符串中考虑空格的话,尤其是当考虑字符串中的空格时,打印J} n=7</代码>>如果不是数字。有关改进的命令,请参见编辑。我看到使用printf“%*s\n”$w“$s”| sed-r's/^(*)/\1x/;s/^(*)/\1x/'将给出长度42 like(带空格的xxHello World),而不是预期的长度40 like(带空格的xxHello World)。但是另一个命令printf“%*s\n”$w“$s”| sed-r”:a;s/^(*)/\10/;ta'给出了长度40。差异从何而来?简单地说printf“%*s\n”$w“$s”| sed-r”:a;s/^(*)/\10/;我们正在使用“\10”,后面的引用\1包含空格。假设文本“Hello World with spaces”之前有3个空格,因为我们使用了“\10”,输出通常是(3spaces000Hello World with spaces)。初始空间消失的地方。请解释printf“%*s\n”$w“$s”| sed-r的/^(*)/\1x/;s/^(*)/\1x/'| wc与我一起重新运行41(包括换行符,我希望您的输出不会以
\r\n
结尾)。我不明白你们的不同线路长度
\s\s\sHello
被更改为
000Hello
,因为
s/^(*)/\10/
中的
后面有一个空格。back ref匹配2个空格,第三个空格替换为
0