Files

重新索引大型 CSV 文件

  • September 19, 2014

我在這個有用的執行緒中查看了答案,但我的問題似乎已經足夠不同了,以至於我想不出好的答案(至少是sed)。

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

<alphanumerical_identifier>,<number>

where<alphanumerical_identifier>在整個文件中是唯一的。我想創建一個單獨的文件,用索引替換第一列,即

<index>,<number>

這樣我們得到:

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

可以awk在不將完整文件載入到記憶體的情況下生成增加的索引嗎?

由於索引單調增加,因此僅刪除索引可能會更好。解決方案會有那麼不同嗎?,即:

<number>
<number>
<number>

不在要測試的終端附近,但是經常被忽視的nl命令呢?就像是:

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

這裡有一些方法,但沒有一個能達到上述解決方案的cut速度nl

  1. awk
awk -F, '{$1=NR;print $1","$2;}' file.csv > newfile.csv
  1. Perl
perl -pe 's/[^,]+/$./' file.csv > newfile.csv

或者

perl -F, -ane '$F[0]=$.; print join ",", @F' file.csv
  1. 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(第一次 perl)、3.1825s(第二次 perl)和驚人的 48.6035s 的 shell。您已經擁有的非常聰明的cut解決方案在 0.6078 秒時快了大約 4 倍。nl

引用自:https://unix.stackexchange.com/questions/156307