我的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秒才能完成拆分。
欢迎任何有关如何改进上述脚本的建议。
干杯
答案 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