2014-10-10 135 views
0

我有一个约230万行的文本文件。每行包含一个64个字符的十六进制字符串。我试图逐行读取文件并将十六进制字符串转换为二进制文件并输出到文件。我在bash中编写了这个简单的循环,但我知道这不是最优的,而且需要永久完成。在大文件中将十六进制转换为二进制文件

有没有更快的方法,例如使用awk?更好地使用Perl?我只需要更快的东西。

cat /tmp/hexFile.log | while read line 
do 
bin=$(echo "obase=2; ibase=16; $line" | bc) 
bin=`echo $bin | sed 's/\\\ //g'` 
echo $bin >> /tmp/binOutput.log 
done 
+0

只是谷歌“使用awk将十六进制转换为二进制”并选择一个解决方案。 – 2014-10-10 14:02:57

+0

埃德你非常有帮助。 – ssbsts 2014-10-10 15:13:50

回答

0

这适用于我。

#!/usr/bin/perl 
while (<>) { 
    chomp; 
    for (my $i = 0; $i < length($_); $i += 1) { 
     printf('%04b', hex(substr($_, $i, 1))) 
    } 
    print "\n"; 
} 
0

最快的方法是做在C

不过,我有一个奇怪的冲动与bash的”本土字符串替换做到这一点....它看起来像精神错乱的一种形式,但它会工作....对不起,我无法抗拒给你看:-)你对C版本感兴趣吗?

#!/bin/bash 

while read LINE 
do 
     LINE={LINE//0/zzzz} 
     LINE={LINE//1/zzzy} 
     LINE={LINE//2/zzyz} 
     LINE={LINE//3/zzyy} 
     LINE={LINE//4/zyzz} 
     LINE={LINE//5/zyzy} 
     LINE={LINE//6/zyyz} 
     LINE={LINE//7/zyyy} 
     LINE={LINE//8/yzzz} 
     LINE={LINE//9/yzzy} 
     LINE={LINE//a/yzyz} 
     LINE={LINE//b/yzyy} 
     LINE={LINE//c/yyzz} 
     LINE={LINE//d/yyzy} 
     LINE={LINE//e/yyyz} 
     LINE={LINE//f/yyyy} 
     LINE={LINE//y/1} 
     LINE={LINE//z/0} 
     echo "$LINE" 
done <yourhexfile>yourbinaryfile 
+0

这也可以用sed以相同的方式完成,也许更快? – Gunstick 2015-08-13 13:17:33

相关问题