我有一个巨大的 csv 文件,大小约为 1 GB。 csv 的第一列包含大约 300 个唯一的整数值。我想处理一次 csv 并根据匹配的第一列值将输出保存到不同的文件。
我知道awk
将输出保存到第 1 列特定值的解决方案。
for i in $column1values; do
awk -F, -v a=$i '$1 == a' input.csv > output-$i.csv
done
但此解决方案每次想要查找匹配的第 1 列值时都会重新读取大 csv 文件。考虑到大的 csv 文件,这是低效的。
那么,如何在仅读取一次 csv 文件的情况下实现这一目标呢?
编辑:
假设我的原始 csv 文件有数据..
1,r1c2,r1c3,r1c4
1,r2c2,r2c3,r2c4
2,r3c2,r3c3,r3c4
2,r4c2,r4c3,r4c4
3,r5c2,r5c3,r5c4
3,r6c2,r6c3,r6c4
我想根据第一列值过滤输出,例如..
输出1.csv:
1,r1c2,r1c3,r1c4
1,r2c2,r2c3,r2c4
输出2.csv
2,r3c2,r3c3,r3c4
2,r4c2,r4c3,r4c4
输出-3.csv
3,r5c2,r5c3,r5c4
3,r6c2,r6c3,r6c4
更重要的是,我想像这样过滤输出,同时只读取一次原始的大 csv 文件。怎么做?
答案1
和awk
:
awk -F, '{f="output-"$1".csv"; print $0 >> f; close(f)}' file
-F,
将分隔符设置为,
.f="output-"$1".csv"
设置要写入的文件名print $0 >> f
将该行追加到文件中f
。close(f)
关闭文件,因为可能有太多打开的文件(感谢 @ 的评论科斯塔斯)