7

Как я могу преобразовать файл с большим количеством шестнадцатеричных чисел в десятичное?

Пример: файл1

 0x59999
 0x5acdc
 0xffeff

Я хочу начать

$ cat file1 | util | cat >file2

и получить file2 с чем-то вроде:

 1021489
 1249230
 3458080

(Числа в примере вывода случайные, так как я не могу преобразовать такие длинные шестнадцатеричные числа в десятичные)

ОБНОВЛЕНИЕ: я решил это с помощью следующей команды Perl:

perl -pe '$_=hex;$_.="\n"'

Есть ли лучшее решение? Реальная задача состоит в том, чтобы иметь возможность сортировать шестнадцатеричные числа.

3 ответа3

7

Ответ Джона Т - это способ перейти к шестнадцатеричным преобразованиям, но вы также можете сделать это следующим образом (что может быть использовано и для других баз):

$ 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 .

4

Я обычно просто использую printf ...

while read x;do printf '%d\n' $x;done <file

0
cat file1 | wcalc -q -d -EE -P0 > file2

Wcalc должен быть установлен первым

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .