基于第一列值的单读过滤器 csv

基于第一列值的单读过滤器 csv

我有一个巨大的 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)关闭文件,因为可能有太多打开的文件(感谢 @ 的评论科斯塔斯

相关内容