1

;-で区切られた16GBのCSVがあり、フィールドは常に引用符で囲まれています。2番目のフィールドが空白の行をすばやく除外する必要があります。

"12345";"987";"..." # keep it
"67890";"";"..."    # omit it

最初の2つのフィールドは、パフォーマンスにとって重要な場合は数値のみです。

私は、awkがこのための最もパフォーマンスの高いツールであるかもしれないと思いますが、私はそれを正しく理解できないようです。私はこれを試しましたが、ほとんどの行が間違って省略されています:

cat huge.csv | awk '/^"\d+";"\d/' > filtered.csv

もちろん、それは厄介である必要はありません。LinuxとOSXで一般的に見られるコマンドラインツールならどれでもかまいません。

4

3 に答える 3

4

単に使用する別のソリューション

awk -F\" '$4' 

つまり、コマンドは次のようになります。

awk -F\" '$4' huge.csv > filtered.csv

これにより、入力フィールドの区切り記号がに設定され"、4番目のフィールドがチェックされます。ゼロ以外の場合は、その行を暗黙的に出力します。与える:

"12345";"987";"..." # keep it

GNUawk3.1.6でテスト済み

于 2012-08-14T22:27:43.857 に答える
1

これを試して:awk -v 'FS=;' '$2 != "\"\""' huge.csv > filtered.csv

説明:awkはファイルをレコードに分割し(デフォルト:改行文字で区切られます)、レコードはレコードに分割されます(デフォルト:空白で区切られます)。

-vオプションを使用すると、スクリプトを実行する前に任意のawk変数を設定できます。FS変数は特別な組み込みであり、フィールドセパレーターの正規表現を指定します。次に、スクリプトは2番目のフィールド(2番目のcsvフィールド)を確認し、空でない場合は、(暗黙的に)レコード全体を出力します。

PS:スクリプトは慣用的ではありませんが、ほぼ正しいです。正規表現は:/^"[^"]*";"\d/である必要があるため、最初のフィールドが数値でない場合は行と一致します。

PPS:特定の正規表現で行をフィルタリングする必要がある場合は、unixユーティリティを使用してgrepください:grep '^"[^"]*";"[0-9]' huge.csv > filtered.csv

于 2012-08-14T22:21:11.413 に答える
1

引用符で囲まれたフィールドに表示されないことがわかっていない限り;、これにawkを使用することはできません。ただし、その基準が満たされている場合は、次のことができます。

awk '$2 != "\"\""' FS=\; huge.csv > filtered.csv

これを次のように書く方が少しきれいかもしれません:

awk -F\; '$2 !~ /^""$/' huge.csv > filtered.csv
于 2012-08-14T22:21:36.267 に答える