2015-07-19 60 views
2

我有一個CSV它看起來像這樣*多個文件:拆分一個CSV到基於字段值

system,subject,value1,value2 
example.org,thing 1,100,4 
exmaple.org,thing 2,90,0 
example.com,thing 1,200,0 
example.com,thing 5,10,10 

頁眉我們實際上不包括在內,但在這裏顯示,使其更易於閱讀的例子。

我想拆分成兩個文件:

example.org.csv有:

thing 1,100,4 
thing 2,90,0 

example.com.csv有:

thing 1,200,0 
thing 5,10,10 

我目前的解決方案以這種方式工作:

while read line; do 
    SYSTEM=$(echo "$line" | cut -d, -f1) 
    NOTTHESYSTEM=$(echo "$line" | cut -d, -f2-) 
    echo "${NOTTHESYSTEM}" >> "${SYSTEM}.csv" 
done <$INPUT 

但是這樣做效率非常低,並且對於更大的文件表現不佳。

在數字上,這意味着52050行/ 9 MB文件需要大約250秒來完成拆分。

任何建議如何改善上面的腳本是值得歡迎的。

乾杯

回答

2

使用awk它會更簡單:

awk 'BEGIN{FS=OFS=","} {print $2, $3, $4 > $1 ".csv"}' "$INPUT" 

驗證:

cat example.org.csv 
thing 1,100,4 
thing 2,90,0 

cat example.com.csv 
thing 1,200,0 
thing 5,10,10 
+1

快得多 - 謝謝。這現在運行在0.3秒而不是250秒。 – pagid

+0

是否可以使用此方法添加gzip階段,以便所有輸出文件都能被壓縮? – Sahas

+0

只是將輸出重定向到一個文件並調用'gzip'來壓縮它。 – anubhava

1

一種方式做到這一點,假設你有一個合理的少數系統:

cut -d, -f1 file.csv | \ 
    sort -u | \ 
    while read -r system; do 
     fgrep -w "$system" file.csv | cut -d, -f2- >"$system".csv 
    done