重新索引大型 CSV 文件

Ame*_*ina 11 sed awk csv files

我浏览了这个有用线程中的答案,但我的问题似乎不同到我想不出好的答案(至少与sed)。

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

<alphanumerical_identifier>,<number>
Run Code Online (Sandbox Code Playgroud)

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

<index>,<number>
Run Code Online (Sandbox Code Playgroud)

以便我们得到:

1, <number>
2, <number>
3, <number>
Run Code Online (Sandbox Code Playgroud)

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

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

<number>
<number>
<number>
Run Code Online (Sandbox Code Playgroud)

bis*_*hop 13

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

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


ter*_*don 7

这里有一些方法,但没有将接近的速度cutnl解决方案上面:

  1. awk

    awk -F, '{$1=NR;print $1","$2;}' file.csv > newfile.csv
    
    Run Code Online (Sandbox Code Playgroud)
  2. 珀尔

    perl -pe 's/[^,]+/$./' file.csv > newfile.csv
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    perl -F, -ane '$F[0]=$.; print join ",", @F' file.csv
    
    Run Code Online (Sandbox Code Playgroud)
  3. Shell(但我不建议将它用于 200G 的文件,它会花费很长时间)

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

以上解决方案按速度排序。我在我的笔记本电脑和一个 40M 的文件上进行了测试,它们(平均 10 次运行)2.2282(awk)、2.4555(第一个 perl)、3.1825s(第二个 perl)和高达 48.6035s 的 shell。非常聪明cutnl解决方案,您已经有大约在0.6078s快4倍。

  • 40G 文件在 2.2282 秒内处理?哪里可以买到那台笔记本电脑? (2认同)
  • @JohnB 嗯,是的,抱歉,那是 40M,而不是 G :) (2认同)