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

Outputting data from 5gb file with awk

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

我正在使用 awk 创建此文件的一个子集,其中第 24 列是 "CA"。

数据示例:

这是我正在尝试的:

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

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

我怎样才能加快速度?也许是 sed / awk 的组合?

\

tl;博士:

  • awk 实现在性能上可能会有很大差异。
  • 在这种特殊情况下,看看使用 gawk (GNU awk) 是否有帮助。

Ubuntu自带mawk作为默认的awk,通常被认为比gawk快。然而,在手头的情况下,似乎 gawk 明显更快(与行长度有关?),至少基于以下简化测试,我 运行 在 Ubuntu 14.04 上的虚拟机中,在一个 1 GB 的文件中,该文件包含 300 列,长度为 2。

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

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

测试脚本:

#!/bin/bash

# Pass in test file
f=

# Suppress stdout
exec 1>/dev/null

awkProg='=="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