2013-06-12 44 views
3

我有一个包含大量十进制RGB颜色代码的文本文件。例如Linux/awk将包含十进制的文件转换为十六进制

000,000,000 
000,003,025 
000,007,048 
000,010,069 
000,014,089 
000,017,108 
000,020,125 
000,024,140 
000,027,155 

我想每一行转换为十六进制格式(期望输出):

00,00,00 
00,03,15 
00,07,30 
00,08,45 

我知道我可以使用printf "%.2x,%.2x,%.2x\n" 000 010 69然而printf "%.2x,%.2x,%.2x\n" 000 010 069不起作用为069不是可转换。

我想awk将作业合理的刀具,但我想我会面临同样的问题转换小数,例如069等

perl -le '$hex = sprintf("%.2x,%.2x,%.2x",005,69,255); print $hex'也有同样的问题,用069

+0

请注意,“printf”%x \ n“010”比“printf”%x \ n“069”更危险,因为它默默地给出了您不期望的结果,而不是因为错误而退出。您可以使用“%02x”填充十六进制数字。不确定最好的解释方式是将C型的八进制数解释为十进制数。 – svk

+0

可能有一些帮助:'bc <<<“obase = 16; 069”'。 – Rubens

回答

4

你”再简单地错过了参数之间的逗号:

echo "000,010,069" | awk -F ',' '{ printf "%02X,%02X,%02X\n", $1, $2, $3 }' 

生产:

00,0A,45 

在Mac OS X(BSD awk)和Linux(GNU awk)上均已验证。

+0

太简单了。谢谢 – moadeep

6

它工作正常,在AWK:

$ echo 000,062,102 | awk '{printf("%x,%x,%x\n", $1,$2,$3)}' FS=, 
0,3e,66 
1

Perl的解决方案:

perl -pe 's/([0-9]+)/sprintf "%02x", $1/ge' INPUT 

你不必在意八进制解释。它仅适用于文字,而不适用于变量的值。

相关问题