2

输入

    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

4 回答 4

3

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

awk '{printf "%04x", strtonum("0x"$1)}'
于 2012-08-01T09:22:47.773 回答
0

你有一个额外%s的 awk 的 printf。你可以使用这个命令:

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
于 2012-08-01T09:17:44.263 回答
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)}'
于 2012-08-01T11:14:13.867 回答
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
于 2014-07-08T15:11:00.073 回答