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

Shell 使用awk将十六进制转换为十进制,shell,awk,Shell,Awk,我有一个很大的csv文件,其中很少列的值是十六进制的。我需要把它们转换成十进制。CSV文件非常大。因此,如果我处理每一行,那么执行脚本需要很多时间。所以我想知道如何通过使用awk命令并行地完成这项工作 如果我逐行处理代码,它就会工作 我像这样处理文件 while read -r line; do start_time=`echo "$line"|awk -F "," '{ print $1 }'` end_time=`echo "$line"|awk -F "," '{ prin

我有一个很大的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
我需要知道语句
“((16#$start\u time))”
如何在awk中使用。 我试过了

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

但是这种语法不起作用。

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

awk -F "," '{ cmd=sprintf("echo $((0x%s))\n", $1); system(cmd); close(cmd); }' input
(由于某些原因,系统调用在我的系统上不能使用
$((16#…)
,但可以使用
$((0x…)

使用
getline
可以将echo'ed输出分配给变量。请参阅以开始使用。

使用GNU awk for strotnum(),您不需要在每个输入行上生成多个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

$awk'BEGIN{FS=OFS=“,”}{for(i=1;i请将您的示例(代码)包装在代码标记中,因为它不清楚。以后,请使用所选文本的编辑菜单中的
{}
工具以获得正确的格式;-)祝你好运。这个命令在下一行打印输出。我怎样才能用逗号打印它。还有多个字段需要这种转换。所以每次我都需要打开和关闭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
的退出状态,因此
foo
system()
返回时已经关闭。您不能使用
system(foo)
修改字段并将其包含在输出中,因为
foo
只需将其输出打印到stderr,而不依赖于awk脚本中的任何
print
s。使用
cmd
修改
$1
的正确方法是
foo=“cmd\047”$1”\047;$1=((foo | getline行)>0行:“N/A”);关闭(foo)
但是在使用之前请阅读,以确保它是有保证的,并且您理解警告。我认为@Ed Morton的解决方案更好,因为它避免了每个输入行产生额外的shell,并且避免了
system()
getline
的所有警告。