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

时间:2019-05-16 11:56:19

标签: shell awk

我有一个很大的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'

但是此语法不起作用。

2 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分:0)

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

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

(由于某些原因,系统调用不适用于我系统上的$((16#...)),但可以与$((0x...))一起使用)

使用getline,您可以将回显的输出分配给变量。请参阅https://www.gnu.org/software/gawk/manual/html_node/Getline-Notes.html入门。