gpt4 book ai didi

linux - 给出文件及其行号以在bash中将十六进制数转换为十进制数

转载 作者:太空宇宙 更新时间:2023-11-04 04:57:00 25 4
gpt4 key购买 nike

我有一个超过 10,000 行的文本文件。在此文件中,行号 713 包含三个十六进制数字,例如 7E 42 C0。我需要将其转换为十进制。如果我在文本文件中只给出这个数字,我的代码就可以正常工作。但是,我想给出文件和该文件的行号

如下所示:

while read p q r; 
do

printf "%d %d %d\n" 0x$p 0x$q 0x$r;

done < $(sed -n '713p' run21.txt);

但它不起作用,并给我一个不明确的重定向错误。请让我知道任何解决方案。

最佳答案

您的做法是正确的,要从 hex 转换为 dec,请使用 bc 以及定义的 ibaseobase,例如

$ echo "obase=10; ibase=16; $(sed -n 713p run21.txt)" | bc

713 行中的任何十六进制值都将输出为十进制。您可以使用 read -r a b c 读取 3 个值并以类似的方式转换每个值。或者,您可以根据您的要求删除 3 个十六进制值之间的空格并将其转换为单个十进制值。例如:

hexval=""
for i in $(sed -n 713p run21.txt); do
hexval="$hexval$i"
done
echo "obase=10; ibase=16; $hexval" | bc

输出

8274624
<小时/>

要单独转换每个,您可以执行以下操作:

for i in $(sed -n 713p run21.txt); do
printf " %d" "$(echo "obase=10; ibase=16; $i" | bc)"
done
printf "\n"

输出

126 66 192
<小时/>

作为使转换更加稳健的另一个步骤,您可以(并且应该)添加对作为输入读取的所有值的验证。您可以对读入每个变量的字符类型进行更多验证,但您至少应该验证您读取填充您期望的值的数量。将它们放在一起,并利用 read 读取并验证所有 3 个值,您可以执行如下操作。

该脚本将line_to_read作为其第一个强制参数,并将要读取的文件名作为其第二个可选参数(默认情况下将从stdin读取):

#!/bin/bash

test -z "$1" && { ## validate line number given
printf "error: insufficient input.\nusage: %s line [file (stdin)]\n" "${0##*/}"
exit 1
}

test "$1" -eq "$1" &>/dev/null || { ## test $1 is an integer value
printf "error: first parameter not an integer '%s'\n" "$1"
exit 1
}

fn="$2" ## read from filename as 2nd parameter (or by default from stdin)
test -f "$fn" || fn=/dev/stdin

read -r a b c < <(sed -n "${1}p" "$fn") ## read each of the values

test -n "$a" -a -n "$b" -a -n "$c" || { ## validate all 3 vars filled
printf "error: less than 3 values on line '%s',\n" "$1"
exit 1
}

printf "input : %3x %3x %3x\n" "0x$a" "0x$b" "0x$c" ## output original line
## output line converted from hex to decimal
printf "output: %3d %3d %3d\n" $(echo "obase=10; ibase=16; $a" | bc) \
$(echo "obase=10; ibase=16; $b" | bc) $(echo "obase=10; ibase=16; $c" | bc)

输入示例

$ cat dat/3hex.txt
7E 42 C0

示例使用/输出

$ bash 3hexcvt.sh 1 <dat/3hex.txt
input : 7e 42 c0
output: 126 66 192

关于linux - 给出文件及其行号以在bash中将十六进制数转换为十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43525301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com