这是文本文件中的当前输出
1 3.491136 C1 00 08 00 DD 92 01 FF
2 3.560963 C1 00 08 00 DD 92 01 FF
3 3.600959 C1 00 08 00 DD 92 01 FF
4 3.640694 01 00
5 3.680950 C1 00 08 00 DD 92 01 FF
6 3.720947 C1 00 08 00 DD 92 01 FF
7 3.760941 C1 00 08 00 DD 92 01 FF
8 3.780677 01 00
9 3.800937 C1 00 08 00 DD 92 01 FF
但所需的输出是(十六进制到十进制转换后)
1 3.491136 193 0 8 0 221 146 1 255
2 3.560963 193 0 8 0 221 146 1 255
3 3.600959 193 0 8 0 221 146 1 255
4 3.640694 1 0
5 3.680950 193 0 8 0 221 146 1 255
6 3.720947 193 0 8 0 221 146 1 255
7 3.760941 193 0 8 0 221 146 1 255
8 3.780677 1 0
9 3.800937 193 0 8 0 221 146 1 255
问题是:我能够使用以下命令进行转换,但写回到文本文件中的输出再次相同(实际上是两次!),但我希望转换后的数据能够写回到文件中。
sed p file_name.txt -i |tr '[a-z]' '[A-z]' |sed 's/ / p /g' |sed 's/$/ p/'|awk '{print "16i "$0}'|dc |tr '\n' ' '
答案1
Perl 解决方案:
perl -nlae '$, = " "; print @F[0,1], map {hex} @F[2..$#F]'
如果空白很重要,则可能需要这个:
perl -lne '($x, $y) = /(^[0-9]+\s*[0-9.]+\s*)([[:alnum:]\s]+)/;
print $x, map {/\s/ ? $_ : hex} split(/( +)/, $y)'
答案2
这是一个awk
仅使用以下方法的解决方案:
awk '{ printf "%s%20s ", $1, $2; for(i=3;i<=NF;i++) printf "%-4d", "0x"$i; print "" }' file_name.txt
它将产生:
1 3.491136 193 0 8 0 221 146 1 255 2 3.560963 193 0 8 0 221 146 1 255 3 3.600959 193 0 8 0 221 146 1 255 4 3.640694 1 0 5 3.680950 193 0 8 0 221 146 1 255 6 3.720947 193 0 8 0 221 146 1 255 7 3.760941 193 0 8 0 221 146 1 255 8 3.780677 1 0 9 3.800937 193 0 8 0 221 146 1 255
笔记:这无法就地工作,如果你真的需要,你可以用以下方法解决:
mv 文件名.txt 文件名.tmp awk'...'文件名.tmp>文件名.txt rm 文件名.tmp
答案3
使用ex
$ echo -e "%s/\<\x\x\>/\=printf('%d', '0x'.submatch(0))/g\n%p" | ex file.txt | column -t
1 3.491136 193 0 8 0 221 146 1 255
2 3.560963 193 0 8 0 221 146 1 255
3 3.600959 193 0 8 0 221 146 1 255
4 3.640694 1 0
5 3.680950 193 0 8 0 221 146 1 255
6 3.720947 193 0 8 0 221 146 1 255
7 3.760941 193 0 8 0 221 146 1 255
8 3.780677 1 0
9 3.800937 193 0 8 0 221 146 1 255
答案4
您所犯的错误是在第一个命令中。
当你说“sed p file.txt -i”时,这意味着:
对于文件中的每一行,打印该行;将输出与原始内容一起保存在文件中。此命令会复制每一行,这与您的预期相差甚远。
只需在文件中放入三行即可:
1
2
3
然后运行 sed p file -i。你将得到:
1
1
2
2
3
3