将21亿行的大型csv文件拆分为以ID为列的较小文件

时间:2019-09-23 20:40:53

标签: python bash

我有一个1TB csv格式的文件

 id   data1   data2 ...
001      x1      y2
001      x2      y2
002      x1      y1
...     ...     ...

我希望每个ID都有一个文件,

[001.csv]
001      x1      y2
001      x2      y2

[002.csv]
002      x1      y1

该文件包含带引号的字符串,并且未按ID排序。我可以运行查询以预先知道所有ID。

在linux命令行或python中执行此操作的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

在命令行上尝试-awk很棒又优雅。 (请确保以下双引号之间的空格数量正确-即id和data1之间的空格

$ awk -F"   " '{print >$1".csv"}'  <your_1Tb_file>

这将创建001.csv,002.csv等文件

根据有关跳过第一行的注释进行编辑-您可能会这样做。这是一个-在awk之前添加管道。

$ tail +2 <your_1Tb_file> |  awk -F"   " '{print >$1".csv"}'

答案 1 :(得分:-1)

这是一个可以执行您想要的操作的shell脚本。不过,我不知道要花费多长时间才能处理1TB数据。

#!/bin/bash

tail -n +2 data.csv | while read -r line; do
    basename=$(echo "$line" | awk '{ print $1 }');

    echo "$line" >> "$basename.csv";
done

tail -n +2-跳过文件的第一行

while read -r line-循环遍历文件的每一行。确保文件以换行符结尾,否则将跳过最后一行。

awk '{ print $1 }'-获取每行的第一个字段,例如001002

echo "$line" >>-将行连接到文件末尾。