2015-02-24 41 views
1

我有一個包含大約300列的csv文件。使用awk從5gb文件輸出數據

我正在使用awk創建此文件的第24列爲「CA」的子集。數據

例子:

enter image description here

這裏就是我想:

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

大約10分鐘後的子文件增長到400 MB,然後我殺了它,因爲這是太慢了。

如何加快速度?也許是sed/awk的組合?

\

+0

試'的awk -F, '$ 24 == 「CA」' myfile.csv' – 2015-02-24 03:45:35

+0

@AvinashRaj相同的同一 – 2015-02-24 03:51:10

+0

這真是令人難以置信。這是i7四核心與24演出的內存,運行全新的Ubuntu安裝。爲什麼需要這麼長時間? – 2015-02-24 04:15:12

回答

2

TL; DR:

  • awk實現可以在性能顯著不同。
  • 在這個特殊情況下,看看是否使用gawk(GNU awk)有幫助。

Ubuntu自帶的mawk作爲默認awk,這通常被認爲比gawk更快。然而,在手頭的情況下,似乎gawk顯着更快(與行長有關),至少是基於下面的簡化測試,我在Ubuntu 14.04上的一個虛擬機上運行 ,在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