如何用awk中的4个零填充十六进制数字?

时间:2012-08-01 09:12:51

标签: awk

INPUT

    63 0063 
    63 0384 
    0 0065 
    65 0065 
    6A 0065 

输出

    0063 0063 
    0063 0384 
    0000 0065 
    0065 0065 
    006A 0065

使用awk'{printf“%04s%04s \ n”,$ 1,$ 2}'输出空格而不是零

 63 0063 
  63 0384 
   0 0065 
  65 0065 
  6A 0065 

4 个答案:

答案 0 :(得分:2)

您可以将十六进制转换为数字,然后再次将其打印为十六进制:

awk '{printf "%04x", strtonum("0x"$1)}'

答案 1 :(得分:0)

你在awk的printf中有一个额外的%s。您可以使用此命令:

awk '{printf "%06s %06s\n", $1, $2}' file.txt

获取宽度为6,其中空格将用零填充。

要在纯粹的bash中做同样的事情,请使用以下代码:

while read a1 a2
do
   printf "%06s %06s\n" $a1 $a2
done < file.txt

答案 2 :(得分:0)

使用子字符串技术将在各种语言中提供一致的结果,尽管语法会有所不同。在AWK:

awk 'function pad(string) {return substr("0000" string, length(string) + 1)} {print pad($1), pad($2)}'

您可以将长度作为参数传递的一种方式:

awk 'function pad(string, len,      z) {z = "000000000000"; return substr(substr(z, length(z) - len) string, length(string) + 1)} {print pad($1, 4), pad($2, 4)}'

答案 3 :(得分:0)

有同样的问题。为什么不使用sed将空格转换为0?

我认为这可行:

echo 63 | awk '{ printf "%4s\n", $0 }' | sed 's/ /0/g' 0063
echo DF | awk '{ printf "%4s\n", $0 }' | sed 's/ /0/g' 00DF