次の答えを見つけました。この便利なスレッドしかし、私の問題は十分に異なるので、良い答えを考えることはできません(少なくともsed
)。
次の行を含む大容量CSVファイル(200 GB以上)があります。
<alphanumerical_identifier>,<number>
ここでは<alphanumerical_identifier>
ファイル全体で一意です。別のファイルを作成したいです。最初の列をインデックスに置き換える、すなわち。
<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
アッ
awk -F, '{$1=NR;print $1","$2;}' file.csv > newfile.csv
真珠
perl -pe 's/[^,]+/$./' file.csv > newfile.csv
または
perl -F, -ane '$F[0]=$.; print join ",", @F' file.csv
シェル(ただし、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.1825秒(2nd perl)で、シェルは驚きました。 48.6035秒かかりました。すでに持っている非常に賢いcut
ソリューションはnl
0.6078秒で約4倍速いです。