2013-06-12 62 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 

你不必在意八進制解釋。它僅適用於文字,而不適用於變量的值。

相關問題