我有一个很大的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'
但是此语法不起作用。
答案 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入门。