awk可改进文件格式:

awk可改进文件格式:,awk,Awk,请帮助改进下面的格式化命令,因为它需要花费大量时间,输入文件分隔符是分开的,22.00百万行和87列。 在输出中,只需选择2列打印substr($3,0,15)、substr($4,3,10)&逗号分隔符 time zcat hlr*.gz | awk -F"**" '{OFS=","; print substr($3,0,15),substr($4,3,10)}' >Op_Formatted.csv 当我在uname中运行上述命令时:Linux需要5小时32分钟 real 319

请帮助改进下面的格式化命令,因为它需要花费大量时间,输入文件分隔符是分开的,
22.00
百万行和
87
列。 在输出中,只需选择
2
打印substr($3,0,15)、substr($4,3,10)
&逗号分隔符

time zcat hlr*.gz | awk -F"**" '{OFS=","; print substr($3,0,15),substr($4,3,10)}' >Op_Formatted.csv
当我在uname中运行上述命令时:Linux需要5小时32分钟

real    319m48.471s
user    313m49.924s
sys 1m32.803s
而uname:CYGWIN_NT-6.1只需要16分钟

real    16m52.823s
user    17m35.485s
sys 0m6.986s
样本输入:

2**000001**804421890831817F**819200000068FFFF**00** 0** 21- 10** 72- 1** 90- 32** 51- 1** 54- 1** 55- 1** 126- 5** 141- 44** 143- 1** 140- 58** 105- 0** 106- 0** 121- 4** 147- 1** 152- 1** 34- 0** 33- 4** 9- 1** 10- 1** 38- 1** 110- 1** 2- 1** 4- 1** 5- 1** 6- 1** 8- 1** 43- 1** 44- 1** 45- 1** 46- 1** 85- 0** 86- 4** 42- 0** 47- 0** 48- 0** 49- 0** 112- 1**9607500248789478**
2**000002**804421812449266F**819200000227FFFF**00** 0** 21- 10** 72- 1** 90- 32** 51- 1** 54- 1** 55- 1** 126- 5** 141- 44** 143- 1** 140- 5** 105- 0** 106- 0** 121- 4** 147- 1** 152- 1** 34- 0** 33- 7** 9- 1** 10- 1** 38- 1** 110- 1** 2- 1** 4- 1** 5- 1** 6- 1** 8- 1** 43- 1** 44- 1** 45- 1** 46- 1** 85- 0** 86- 4** 42- 0** 47- 0** 48- 0** 49- 0** 112- 1**4592140525164919**
2**000003**804421830628518F**819200000312FFFF**00** 0** 21- 10** 72- 1** 90- 35** 51- 1** 54- 1** 55- 1** 126- 5** 141- 44** 140- 58** 105- 0** 106- 0** 121- 4** 147- 1** 152- 1** 34- 0** 33- 4** 9- 1** 10- 1** 38- 1** 110- 1** 2- 1** 4- 1** 5- 1** 6- 1** 8- 1** 43- 1** 44- 1** 45- 1** 46- 1** 85- 0** 86- 4** 42- 0** 47- 0** 48- 0** 49- 0** 112- 1**6570980506503001**
样本输出:

804421890831817,9200000068
804421812449266,9200000227
804421830628518,9200000312

检查linux环境是否存在内存问题或磁盘I/O读取问题。我的环境很好

这里有一些建议

首先,将OFS放在外部,在命令中,OFS在每一行上都被再次定义

zcat hlr*.gz | awk '{print substr($3,0,15),substr($4,3,10)}' FS="**" OFS="," >Op_Formatted.csv >Op_Formatted.csv
如果位置未更改,请尝试以下操作:

zcat hlr*.gz | awk '{print substr($0,12,15) "," substr($0,32,10)}' >Op_Formatted.csv >Op_Formatted.csv
在3000行文件上使用第一个命令进行测试

real    0m0.297s
user    0m0.249s
sys     0m0.046s
使用第二个命令进行测试:

real    0m0.078s
user    0m0.077s
sys     0m0.030s

非常感谢BMW的建议,我正在运行建议的命令,并在工作完成后更新您。…+1用于将OFS设置移到外部,但我会使用
-v
来完成。我怀疑打印显式逗号会比设置OFS慢,因为前者会在打印之前调用字符串连接,这是awk中最慢的操作,甚至比I/O慢。对于时间统计-您是否先运行每个命令3或4次以消除缓存影响?如果“打印”,“直接使用第一个命令,节省约0.05秒(3000行)感谢Ed Morton&BMV的建议,第二个命令的运行速度似乎比第一个命令快,所用时间从6小时减少到8分钟::Time zcat hlr*.gz|awk'{print substr($0,12,15)”,“substr($0,32,10)}“>Op_Formatted_Tech_New.csv>Op_Formatted_Tech_New.csv real 8m58.206s user 8m6.186s sys 0m20.700s time zcat hlr*.gz|awk'{print substr($3,0,15),substr($4,3,10)}'FS=“**”of s=“,”>Op_Formatted_Tech New22.csv>Op_Formatted_Tech New22.csv real 386m32.201st这是很好的反馈。很乐意帮助您。
-F'**'
表示字母*重复了零次或多次。如果您有一个空字段,这将很重要,因为
a****b
将被视为2个字段,而不是3个。您应该使用
-F'*[*]'
或类似工具。另外,
substr()
的第二个参数是起始字符位置。第一个字符的位置是1,而不是0。使用
0
“有效”,因为这是一个无效的位置,所以awk会尽其所能使用它,并假设您的意思一定是
1
。我不知道这是否会减慢速度,但请使用正确的
1