重新索引大型CSV文件


11

我在这个有用的线程中仔细研究了答案,但是我的问题似乎相去甚远,以至于我无法想到一个好的答案(至少使用sed)。

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

<alphanumerical_identifier>,<number>

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

<index>,<number>

这样我们得到:

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

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

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

<number>
<number>
<number>

我不确定该解决方案的可行性。但是,如何在一个单独的文件中生成与CSV文件中一样多的数字,然后将CSV文件的第二列附加到该文件呢?
Ramesh 2014年

@Ramesh只要输出正确就可以了。
阿梅利奥·瓦兹克斯·雷纳

2
我怀疑我误会了一些东西;否则,awk -F, '{print ++n, $2}'会起作用。或awk -F, '{print $2}'第二种变化。
G-Man说'Resstate Monica'2014/

2
@ G-Man,虽然FNR可能效果和++n
iruvar

1
我会三重检查您是否真的可以摆脱该Uniq标识符...为什么不添加带有索引的第一(第三)列,但仍保留该标识符?该标识符不是其他地方使用的吗?
奥利维尔·杜拉克

Answers:


13

不是在要测试的终端附近,而是经常被忽略的nl命令呢?就像是:

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


1
PS:200GB CSV文件?哇,我认为以CSV(几张DVD)的形式与北美Ported Number数据库一起工作是巨大的!
主教

1
可行,尽管数字后面有很大的空白。:我会取代它cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
安赫尔

@Angel:谢谢,更新了我的答案以使用width选项-w 1而不是左数字。
主教

谢谢@bishop-输入和输出文件名去哪里?
阿梅利奥·瓦兹克斯·雷纳

1
@ user815423426是的,在cut管道符号(|)之前的命令将仅显示第二列,实际上具有隐式行号。
主教

7

这里有几种方法,但是没有一种方法可以达到上述cutnl解决方案的速度:

  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(1st perl),3.1825s(2nd perl)和高达48.6035s的外壳。您已经拥有的非常聪明cutnl解决方案的速度大约是0.6078s的4倍。


好的,谢谢您的统计!外壳结果使我有些惊讶。如果替换printfecho,则时间会明显缩短吗?
主教

2
在2.2282秒内处理了40G文件?我在哪里可以买到那台笔记本电脑?
约翰B

2
@JohnB嗯,是的,很抱歉,那是40M,不是G :)
terdon

我喜欢用重置$1方法awk。该cut解决方案肯定快得多,但这是可以预期的,因为它不会被<alphanumerical_identifier>任何东西取代。我认为最快的awk变体可能是:mawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv
约翰B

@JohnB啊,是的,我猜想使用OFS而不是显式打印,会稍微快一些,这很可能会增加巨大文件的数量。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.