我有一个大的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'
型
但这种语法不起作用。
4条答案
按热度按时间hl0ma9xz1#
使用GNU awk for strtonum(),您不需要在每个输入行上生成多个shell:
字符串
v09wglhw2#
您可以使用
system(...)
从withnig awk执行系统调用。不要忘记关闭命令。字符串
(for由于某些原因,系统调用在我的系统上不适用于
$((16#...))
,但适用于$((0x...))
)使用
getline
,您可以将echo'艾德输出分配给变量。请参阅https://www.gnu.org/software/gawk/manual/html_node/Getline-Notes.html以帮助您入门。amrnrhlw3#
也可以使用
sprintf
:字符串
yhuiod9q4#
无需函数调用:
mawk-1
、nawk
、gawk -n
、gawk -nM
或gawk -P
gawk -MP
、gawk -c
、gawk -e
或mawk-2
上 * 不是 *单个
regex
调用将类似于的字符串
如果输入的十六进制已经有
0x | 0X
前缀,那么它真的很简洁: