重新索引大型 CSV 文件

重新索引大型 CSV 文件

我浏览了以下答案这个有用的线程,但我的问题似乎足够不同,我想不出好的答案(至少是sed)。

我有一个大型 CSV 文件(200+ GB),其中的行如下所示:

<alphanumerical_identifier>,<number>

在哪里<alphanumerical_identifier>在整个文件中是唯一的。我想创建一个单独的文件用索引替换第一列, IE

<index>,<number>

这样我们就得到:

1, <number>
2, <number>
3, <number>

可以awk在不将完整文件加载到内存中的情况下生成递增索引吗?

由于索引单调增加,因此直接删除索引可能会更好。解决方案会有所不同吗?即:

<number>
<number>
<number>

答案1

不在终端附近进行测试,但是经常被忽视的nl命令怎么样?就像是:

cut -f 2 -d , original.csv | nl -w 1 -p -s , > numbered.csv

答案2

这里有一些方法,但没有一个能达到上面解决方案cut的速度:nl

  1. awk

    awk -F, '{$1=NR;print $1","$2;}' file.csv > newfile.csv
    
  2. 珀尔

    perl -pe 's/[^,]+/$./' file.csv > newfile.csv
    

    或者

    perl -F, -ane '$F[0]=$.; print join ",", @F' file.csv
    
  3. Shell(但我不推荐它用于200G的文件,这需要很长时间)

    i=1; while IFS=, read foo num; do 
            printf "%d,%s\n" $((i++)) $num; 
    done < file.csv > newfile.csv
    

上述解决方案按速度顺序排序。我在我的笔记本电脑和一个 40M 文件上进行了测试,结果是(10 次运行的平均值)2.2282 (awk)、2.4555 (第 1 个 perl)、3.1825 秒 (第 2 个 perl) 以及 shell 的惊人耗时 48.6035 秒。您已经拥有的非常聪明的cut解决nl方案大约快了 4 倍,速度为 0.6078 秒。

相关内容