1
我有一個包含大約300列的csv文件。使用awk從5gb文件輸出數據
我正在使用awk創建此文件的第24列爲「CA」的子集。數據
例子:
這裏就是我想:
awk -F "," '{if($24~/CA/)print}' myfile.csv > subset.csv
大約10分鐘後的子文件增長到400 MB,然後我殺了它,因爲這是太慢了。
如何加快速度?也許是sed/awk的組合?
\
我有一個包含大約300列的csv文件。使用awk從5gb文件輸出數據
我正在使用awk創建此文件的第24列爲「CA」的子集。數據
例子:
這裏就是我想:
awk -F "," '{if($24~/CA/)print}' myfile.csv > subset.csv
大約10分鐘後的子文件增長到400 MB,然後我殺了它,因爲這是太慢了。
如何加快速度?也許是sed/awk的組合?
\
TL; DR:
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=$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
試'的awk -F, '$ 24 == 「CA」' myfile.csv' – 2015-02-24 03:45:35
@AvinashRaj相同的同一 – 2015-02-24 03:51:10
這真是令人難以置信。這是i7四核心與24演出的內存,運行全新的Ubuntu安裝。爲什麼需要這麼長時間? – 2015-02-24 04:15:12