使用shell脚本将零填充为二进制数

时间:2014-05-30 18:27:04

标签: bash shell scripting binary printf

如何使用shell脚本将零填充为二进制数。

binary.txt

1010011100010001010111001101111
0
10110000000101000000000000001
10100000011
1000000100
1111111111111111
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000

当我执行以下操作时

printf "%032s\n" $(<binary.txt)

我得到一个白色空间。

  1010011100010001010111001101111
                                0
    10110000000101000000000000001
                      10100000011
                       1000000100
                 1111111111111111
 11111111111111110000000000000000
 11111111111111110000000000000000
 11111111111111110000000000000000

但我需要附加零。任何输入都表示赞赏。 感谢,

已更新:

binary.txt是我的输入文件,包含以下内容。

1010011100010001010111001101111
0
10110000000101000000000000001
10100000011
1000000100
1111111111111111
11111111111111110000000000000000
11111111111111110000000000000000

在命令行中运行以下命令时,它可以正常工作。

   printf "%032s\n" $(<binary.txt) | tr ' ' '0' >> t1.mif

但是当我尝试使用下面的脚本执行相同操作时,它会给我错误的值。任何建议。

#!/bin/bash
FILE=binary.txt
while read line;do
    printf "%032s\n" $line | tr ' ' '0' >> t1.mif
done < $FILE

感谢

3 个答案:

答案 0 :(得分:4)

您可以使用tr将零空格替换为

printf "%032s\n" $(<binary.txt) | tr ' ' '0'

答案 1 :(得分:2)

不幸的是printf不支持字符串填充 - 除了宽空格。您可以使用以下awk脚本作为替代。

awk '{for(i=length($0);i<32;i++){$0="0"$0}print}' bin.txt 

答案 2 :(得分:2)

julienc使用tr的答案是正确的,也是最好的可移植解决方案,但我想强调一下,你在printf的BSD和GNU实现之间找到了一个有趣的区别。

FreeBSD

 `0' (zero)   Zero padding.  For all conversions except n, the converted value is
              padded on the left with zeros rather than blanks.

GNU C in Linux

 0            The value should be zero padded.  For d, i, o, u, x, X, a, A,
              e, E, f, F, g, and G conversions, the converted value is
              padded on the left with zeros rather than blanks.

因此,您的代码可能适用于Mac OS X等BSD实现,但为了便于携带,您应该使用上述tr解决方案。

请注意,为了溢出,切换到%d%s也是不对的:

printf "%032d\n" "101010101010101010101010101010"
-bash: printf: warning: 101010101010101010101010101010: Result too large
00000000000009223372036854775807