【问题标题】:Outputting data from 5gb file with awk使用 awk 从 5gb 文件输出数据
【发布时间】:2015-04-25 14:27:56
【问题描述】:

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

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

数据示例:

这是我正在尝试的:

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

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

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

\

【问题讨论】:

  • 试试awk -F, '$24=="CA"' myfile.csv
  • @AvinashRaj 相同
  • 这真是难以置信。这是具有 24 GB RAM 的 i7 四核,运行全新安装的 ubuntu。为什么要花这么长时间?

标签: csv ubuntu awk sed grep


【解决方案1】:

tl;博士:

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

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

测试还包括等效的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2012-04-16
    • 2021-02-03
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多