shell 使用awk将十六进制转换为十进制

5sxhfpxr  于 2023-08-07  发布在  Shell
关注(0)|答案(4)|浏览(152)

我有一个大的csv文件,其中几列值是十六进制的。我需要把它们转换成十进制。CSV文件非常大。所以如果我处理每一行,那么执行脚本就需要花费很多时间。所以我想知道如何通过使用awk命令并行地完成这一任务
如果我一行一行地处理代码,它就工作了。
我是这样处理文件的。

while read -r line;
do
    start_time=`echo "$line"|awk -F "," '{ print $1 }'`
    end_time=`echo "$line"|awk -F "," '{ print $2 }'`
    st_time=$((16#$start_time))
    en_time=$((16#$end_time))

字符串
然后我回显所需的字段到输出文件。
输入文件示例:

16a91f90539,16a91f931a9,e,0
16a91f90bab,16a91f931a9,e,0


预期的输出:

1557227177273,1557227188649,e,0
1557227178923,1557227188649,e,0


我需要知道如何在awk中使用"((16#$start_time))"语句。我试过了

awk -F',' '{OFS=",";}{print '"(($1#16))"','$en_time',$3'


但这种语法不起作用。

hl0ma9xz

hl0ma9xz1#

使用GNU awk for strtonum(),您不需要在每个输入行上生成多个shell:

$ awk 'BEGIN{FS=OFS=","} {for (i=1;i<=2;i++) $i=strtonum("0x"$i)} 1' file
1557227177273,1557227188649,e,0
1557227178923,1557227188649,e,0

字符串

v09wglhw

v09wglhw2#

您可以使用system(...)从withnig awk执行系统调用。不要忘记关闭命令。

awk -F "," '{ cmd=sprintf("echo $((0x%s))\n", $1); system(cmd); close(cmd); }' input

字符串
(for由于某些原因,系统调用在我的系统上不适用于$((16#...)),但适用于$((0x...))
使用getline,您可以将echo'艾德输出分配给变量。请参阅https://www.gnu.org/software/gawk/manual/html_node/Getline-Notes.html以帮助您入门。

amrnrhlw

amrnrhlw3#

也可以使用sprintf

$ awk 'BEGIN{FS=OFS=","} {for (i=1;i<=2;i++) $i=sprintf("%d", "0x"$i)} 1' file
2147483647,2147483647,e,0
2147483647,2147483647,e,0

字符串

yhuiod9q

yhuiod9q4#

无需函数调用:

echo '16a91f90539,16a91f931a9,e,0
      16a91f90bab,16a91f931a9,e,0' |
gawk -n '($1 = +("0x"$1))($2 = +("0x"$2))' FS=',' OFS=','
mawk     '$1 = +("0x"$+($2 =+("0x"$2))^_)' FS=,   OFS=,
1557227177273,1557227188649,e,0
1557227178923,1557227188649,e,0
  • 适用于mawk-1nawkgawk -ngawk -nMgawk -P
  • 但在gawk -MPgawk -cgawk -emawk-2上 * 不是 *
    单个regex调用将类似于
nawk 'sub("^[^,]+,", "0x&0x")($1+=_)($2+=_)'
1557227177273,1557227188649,e,0
1557227178923,1557227188649,e,0

的字符串
如果输入的十六进制已经有0x | 0X前缀,那么它真的很简洁:

echo 0x123456789ABCDEF010141010FEDCBA987654321 |
gawk -nM '$_+=_'
6495562832581790663020768316961677305853592353 (a 152-bit prime)

相关问题