awk改进格式文件:

时间:2014-05-06 05:53:10

标签: awk

请帮助改进以下格式化命令,因为它需要花费大量时间,输入文件分隔符为**分隔,22.00百万行和87列。 在输出中,只需选择2print 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

1 个答案:

答案 0 :(得分:1)

检查您的linux env是否存在内存问题或磁盘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