我有一个大约300列的csv文件。
我正在使用 awk 创建此文件的子集,其中第24列为“CA”。
数据示例:
这是我正在尝试的:
awk -F "," '{if($24~/CA/)print}' myfile.csv > subset.csv
大约10分钟后,子集文件增长到400 mb,然后我杀了它,因为这太慢了。
如何加快速度?也许是sed / awk的组合?
\
答案 0 :(得分:2)
TL; DR:
awk
实施可以在性能上有显着差异。gawk
(GNU awk)帮助。 Ubuntu附带mawk
作为默认awk
,通常被认为比gawk
更快。但是,在目前的情况下,似乎gawk
明显更快(与行长度有关?),至少基于我运行的以下简化测试
在Ubuntu 14.04上的VM中,1 GB文件,300列长度为2。
测试还包括等效的sed
和grep
命令。
希望它们至少提供一种比较性的感觉。
测试脚本:
#!/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