2017-11-04 25 views
0

約150列のCDRファイル(.CSV)があり、非常に大きなファイルです。 31番目の列の値が "13"の出力を得ようとしています。.CSVファイルでawkコマンドを使用して検索する方法

awk -F',' '$31~/^13/' report_1.csv > report_2.csv 

をしかし、次のエラー取得:

私は、以下のコマンドをしようとしている

awk: record `,1402786,535,1,47432... has too many fields record number 1` 

任意の助けを?

+0

どのバージョンのawkを使用していますか? – hek2mgl

答えて

1

は、私がお勧め:awk

awk -F',' '$31 == "13"' report_1.csv > report_2.csv 
0

一部の実装では、列の最大数が付属しています。例えば、mawk。あなたは、このような明示的な制限はありませんGNU AWK、gawkを、使用することができ、この周りを歩いて

$ mawk 'BEGIN{NF=32768}' 
mawk: program limit exceeded: maximum number of fields size=32767 
     FILENAME="" FNR=0 NR=0 

を:あなたはこのように、NFに割り当てることで、簡単にこれをテストすることができます。

$ gawk 'BEGIN{NF=32768}' 
$ gawk 'BEGIN{NF=1000000}' 

これは、まだ使用可能なメモリの量によって制限されています。 (しかし、それはあなたが普通のPCに少なくとも何百万ものフィールドを持つことができるはずです)。

PS:gawkをインストールする必要がありますが、そのような大きなファイルの処理は遅くなることがあります。

1

フィールドの数の制限は150未満であってはなりません。だから、はおそらくあなたのCSVファイルを正しく解析していないと思います。

特定の場合は、カンマで区切ってはいけません。,を引用フィールド内で分割しないでください("like,this")。

あなたはGNU awkを使用している場合は、適切なCSVの構文解析が(@Edモートンがthis excellent answerによる)FPAT経由で非常に単純です:

awk -v FPAT='[^,]*|"[^"]+"' '$31 ~ /^13/' file 

か、完全一致のために:

awk -v FPAT='[^,]*|"[^"]+"' '$31 == "13"' file 

非GNU awkの場合は、代わりの解析方法については、引用した回答を参照してください。

+0

ありがとうございました....私は出力を31行目が "13"、56列目が "ABC"、80列目がawkコマンドでなければならないかどうか尋ねる必要があります。 – User123

+1

'$ 31 == "13" && $ 56 == "ABC" && $ 80〜/.../'の条件を組み合わせるだけです。 – randomir

+0

@ User123、私はあなたに既にあなたに答えることができた前に[新しい質問](https://stackoverflow.com/questions/47113325/trying-to-get-the-results-using-awk)でこれを尋ねましたコメント:)とにかく、この答えはあなたを助けますか、それともあなたが持っていた最初の問題を解決しますか? – randomir

関連する問題