根据字段值

时间:2015-07-19 10:34:14

标签: bash 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 with:

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

example.com.csv with:

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 个答案:

答案 0 :(得分: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 :(得分:1)

一种方法,假设你的系统数量相当少:

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