【问题标题】:Convert hex to dec using awk使用 awk 将十六进制转换为十进制
【发布时间】:2019-05-16 11:56:18
【问题描述】:

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

但是这种语法不起作用。

【问题讨论】:

  • 由于不清楚,请务必将您的示例(代码)包装在代码标签中。
  • 以后,请使用编辑菜单中的{} 工具对所选文本进行正确的格式设置;-) 祝您好运。

标签: shell awk


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以使用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 以帮助您入门。

    【讨论】:

    • 此命令在下一行打印输出。如何用逗号打印它。还有多个字段需要这种转换。所以每次我都需要打开和关闭cmd。例如,为了打印 3 行,我试过这样 "awk -F ","'{OFS=",";}{ cmd=sprintf("echo $((0x%s))\n", $1); system( cmd); close(cmd); }{ cmd=sprintf("echo $((0x%s))\n", $2); system(cmd); close(cmd); }{print $3}'".但这是用新行打印所有值
    • system(foo) 的返回值是foo 的退出状态,所以foosystem() 返回时已经关闭。您不能使用system(foo) 修改字段并将它们包含在输出中,因为foo 只会将其输出打印到stderr,而与awk 脚本中的任何prints 无关。使用cmd 修改$1 的正确方法是foo="cmd \047"$1"\047"; $1=( (foo | getline line) &gt; 0 ? line : "N/A"); close(foo),但在使用它之前请阅读awk.freeshell.org/AllAboutGetline,以确保它是有保证的并且您了解注意事项。
    • 我认为@Ed Morton 的解决方案更好,因为它避免在每个输入行产生额外的shell,并避免system()getline 的所有警告。
    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 2015-08-22
    • 2011-06-04
    • 2011-12-25
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多