大きな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ファイルの2番目の列をそのファイルに追加するだけではどうでしょうか。
Ramesh 2014

@Ramesh出力が正しい限り、これで問題ありません。
Amelio Vazquez-Reina

2
私は何かを誤解していると思います。それ以外の場合awk -F, '{print ++n, $2}'は機能します。またはawk -F, '{print $2}'2番目のバリエーションの場合。
G-Manは 'Reinstate Monica'を

2
@ G-Man、それはおそらくFNR同様ですが、同様に機能します++n
iruvar

1
私はあなたが本当にそのUniq識別子を取り除くことができることをトリプルチェックします...なぜ最初の(3番目の)列をインデックスに追加しますが、それでも識別子を保持しませんか?その識別子は他の場所で使用されていませんか?
Olivier Dulac 2014

回答:


13

テストする端末の近くではありませんが、よく見落とされているnlコマンドはどうですか?何かのようなもの:

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


1
PS:200GB CSVファイル?うわー、私は北米の移植番号データベースをCSV(2枚のDVD)として扱うのは大変だと思いました。
ビショップ

1
数字の後に大きな空白がありますが、機能します。私はそれを次のものに置き換えます。cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
Ángel'18

@Angel:ありがとう、-w 1左番号付けの代わりに幅オプションを使用するように私の回答を更新しました。
ビショップ

ありがとう@bishop-入力ファイル名と出力ファイル名はどこに行くのですか?
Amelio Vazquez-Reina

1
@ user815423426はい、cutパイプ記号(|)の前のコマンドは2列目だけを提供し、実質的に暗黙の行番号を持ちます。
ビショップ、

7

ここにいくつかのアプローチがありますが、上記の速度cutnlソリューションに近づくことはできません。

  1. awk

    awk -F, '{$1=NR;print $1","$2;}' file.csv > newfile.csv
  2. Perl

    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(1番目のperl)、3.1825s(2番目のperl)とシェルになんと48.6035秒かかりました。非常に賢いcutnlあなたが既に持っているソリューションは、より速く0.6078sで4倍程度でした。


統計情報ありがとうございます。シェルの結果は、私を多少驚かせます。に置き換えるprintfecho、タイミングが大幅に向上しますか?
ビショップ

2
40Gファイルは2.2282秒で処理されましたか?そのラップトップはどこで入手できますか?
ジョンB

2
@JohnBうーん、はい、ごめんなさい、Gではなく40Mでした:)
terdon

での$1アプローチの再設定が好きawkです。cutソリューションは、はるかに高速確かですが、それは置き換えられないよう、それは予想されることです<alphanumerical_identifier>何でも。最速のawkバリアントは次のようなものになると思いますmawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv
ジョンB

@JohnBああ、そうです。OFS明示的に印刷,する代わりに使用すると、わずかに速くなり、巨大なファイルで大きな違いが生じる可能性があると思います。
terdon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.