2015-07-19 42 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