大容量CSVファイルのインデックスを再生成します。

大容量CSVファイルのインデックスを再生成します。

次の答えを見つけました。この便利なスレッドしかし、私の問題は十分に異なるので、良い答えを考えることはできません(少なくとも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

  1. アッ

    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. シェル(ただし、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ソリューションはnl0.6078秒で約4倍速いです。

関連情報