Files
重新索引大型 CSV 文件
我在這個有用的執行緒中查看了答案,但我的問題似乎已經足夠不同了,以至於我想不出好的答案(至少是
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
:
- awk
awk -F, '{$1=NR;print $1","$2;}' file.csv > newfile.csv
- Perl
perl -pe 's/[^,]+/$./' file.csv > newfile.csv
或者
perl -F, -ane '$F[0]=$.; print join ",", @F' file.csv
- 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