使用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。
测试还包括等效的 sed
和 grep
命令。
希望它们至少能提供一种比较性能的感觉。
测试脚本:
#!/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
我有一个包含大约 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。
测试还包括等效的 sed
和 grep
命令。
希望它们至少能提供一种比较性能的感觉。
测试脚本:
#!/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