使用awk从5gb文件输出数据

时间:2015-02-24 03:43:05

标签: csv ubuntu awk sed grep

我有一个大约300列的csv文件。

我正在使用 awk 创建此文件的子集,其中第24列为“CA”。

数据示例:

enter image description here

这是我正在尝试的:

awk -F "," '{if($24~/CA/)print}' myfile.csv > subset.csv

大约10分钟后,子集文件增长到400 mb,然后我杀了它,因为这太慢了。

如何加快速度?也许是sed / awk的组合?

\

1 个答案:

答案 0 :(得分:2)

TL; DR:

  • awk实施可以在性能上有显着差异。
  • 在这种特殊情况下,看看是否使用gawk(GNU awk)帮助。

Ubuntu附带mawk作为默认awk,通常被认为比gawk更快。但是,在目前的情况下,似乎gawk明显更快(与行长度有关?),至少基于我运行的以下简化测试 在Ubuntu 14.04上的VM中,1 GB文件,300列长度为2。

测试还包括等效的sedgrep命令。

希望它们至少提供一种比较性的感觉。

测试脚本:

#!/bin/bash

# Pass in test file
f=$1

# Suppress stdout
exec 1>/dev/null

awkProg='$24=="CA"'

echo $'\n\n\t'" $(mawk -W version 2>&1 | head -1)" >&2
time mawk -F, "$awkProg"  "$f"

echo $'\n\n\t'" $(gawk --version  2>&1 | head -1)" >&2
time gawk -F, "$awkProg"  "$f"

sedProg='/^([^,]+,){23}CA,/p'

echo $'\n\n\t'" $(sed --version  2>&1  | head -1)" >&2
time  sed -En "$sedProg"  "$f"

grepProg='^([^,]+,){23}CA,'

echo $'\n\n\t'" $(grep --version  2>&1 | head -1)" >&2
time grep -E "$grepProg"  "$f"

结果:

     mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

real    0m11.341s
user    0m4.780s
sys 0m6.464s


     GNU Awk 4.0.1

real    0m3.560s
user    0m0.788s
sys 0m2.716s


     sed (GNU sed) 4.2.2

real    0m9.579s
user    0m4.016s
sys 0m5.504s


     grep (GNU grep) 2.16

real    0m50.009s
user    0m42.040s
sys 0m7.896s