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

Вам не придется заботиться о восьмеричном интерпретации. Это относится только к литералам, а не к значениям переменных.

Смежные вопросы