Ответ Джона Т - это способ перейти к шестнадцатеричным преобразованиям, но вы также можете сделать это следующим образом (что может быть использовано и для других баз):
$ hexval=0x59999
$ hexval=${hexval#*x}
$ echo $((16#$hexval))
367001
Демонстрация:
$ echo $((2#1011010))
90
$ echo $((8#1776))
1022
$ echo $((23#mmmmm))
6436342
Редактировать:
#!/bin/bash
base=16
while read -r val
do
val=${val#*x}
echo $(($base#$val))
done < inputfile > outputfile
Единственное преимущество перед ответом Джона Т заключается в том, что его можно легко адаптировать для преобразования других основ в десятичную. Его немного быстрее.
Эта команда gawk
кажется немного быстрее, чем версия оболочки Джона:
gawk --non-decimal-data '{printf "%d\n",$1}' inputfile > outputfile
Это примерно с той же скоростью, что и ваша команда Perl. Почему бы просто не использовать это?
Кстати, последнюю часть вашего однострочного Perl можно заменить опцией -l
:
perl -lpe '$_=hex'
Еще одно примечание: как правило, конвейер, который вы показываете в своем вопросе, будет записан как:
util < file1 > file2
или, если cat
представляет заполнители, то должны использоваться фиктивные имена:
prog1 < file1 | util | prog2 > file2
тогда люди не будут жаловаться на бесполезное использование cat
.