如何使用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
感谢
答案 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实现之间找到了一个有趣的区别。
`0' (zero) Zero padding. For all conversions except n, the converted value is
padded on the left with zeros rather than blanks.
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