Unix 如何在.CSV文件中使用awk命令搜索结果

Unix 如何在.CSV文件中使用awk命令搜索结果,unix,awk,grep,Unix,Awk,Grep,我有一个CDR文件(.CSV),它包含大约150列,是一个非常大的文件。我试图得到第31列应该有值“13”的输出 我正在使用以下命令进行尝试: awk -F',' '$31~/^13/' report_1.csv > report_2.csv 但是得到以下错误: awk: record `,1402786,535,1,47432... has too many fields record number 1` 有什么帮助吗?我建议: awk -F',' '$31 == "13"' rep

我有一个CDR文件(.CSV),它包含大约150列,是一个非常大的文件。我试图得到第31列应该有值“13”的输出

我正在使用以下命令进行尝试:

awk -F',' '$31~/^13/' report_1.csv > report_2.csv
但是得到以下错误:

awk: record `,1402786,535,1,47432... has too many fields record number 1`
有什么帮助吗?

我建议:

awk -F',' '$31 == "13"' report_1.csv > report_2.csv
我建议:

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

awk
的某些实现具有最大列数<例如,code>mawk。通过分配给
NF
,您可以轻松测试这一点,如下所示:

$ mawk 'BEGIN{NF=32768}'
mawk: program limit exceeded: maximum number of fields size=32767
        FILENAME="" FNR=0 NR=0
要解决这个问题,可以使用GNUawk,
gawk
,它没有这样明确的限制

$ gawk 'BEGIN{NF=32768}'
$ gawk 'BEGIN{NF=1000000}'
嗯,它仍然受到可用内存量的限制。(但这应该允许您在普通pc上至少有数百万个字段)


PS:您可能需要安装
gawk
,当然,处理如此大的文件可能会很慢。

一些
awk
的实现具有最大列数<例如,code>mawk。通过分配给
NF
,您可以轻松测试这一点,如下所示:

$ mawk 'BEGIN{NF=32768}'
mawk: program limit exceeded: maximum number of fields size=32767
        FILENAME="" FNR=0 NR=0
要解决这个问题,可以使用GNUawk,
gawk
,它没有这样明确的限制

$ gawk 'BEGIN{NF=32768}'
$ gawk 'BEGIN{NF=1000000}'
嗯,它仍然受到可用内存量的限制。(但这应该允许您在普通pc上至少有数百万个字段)


PS:您可能需要安装
gawk
,当然,处理如此大的文件可能会很慢。

字段数量的限制不应低至150个,因此我猜您可能没有正确解析CSV文件

如果是特定的,不应仅在任何逗号上拆分-应避免在带引号的字段中拆分
“如此”

如果您使用的是GNU
awk
,正确的CSV解析非常简单(根据@Ed Morton的说法):

或者,为了精确匹配:

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

在非GNU
awk
的情况下,请参考引用的答案以获得替代解析方法。

字段数量的限制不应低至150个,因此我猜您可能没有正确解析CSV文件

如果是特定的,不应仅在任何逗号上拆分-应避免在带引号的字段中拆分
“如此”

如果您使用的是GNU
awk
,正确的CSV解析非常简单(根据@Ed Morton的说法):

或者,为了精确匹配:

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

在非GNU
awk
的情况下,请参考引用的答案以获得替代的解析方法。

您使用的是哪个版本的
awk
?您使用的是哪个版本的
awk
?谢谢……我需要询问我是否希望输出,其中第31列为“13”,第56列为“ABC”,第80列,awk命令应该是什么?只需结合以下条件:“$31==”13“&&&&$56==”ABC“&&&$80~/…/”。@User123,我看到在我回答你的评论之前,你已经在a中问过这个问题:)不管怎样,这个答案对你有帮助吗,和/或它解决了您最初遇到的问题吗?谢谢……我需要问一下,如果我想要输出,其中第31列为“13”,第56列为“ABC”,第80列,那么awk命令应该是什么?只需结合以下条件:'$31==“13”&&&$56==“ABC”&&$80~/'.@User123,在我能够回答你的评论之前,我看到你已经在a中问了这个问题:)无论如何,这个答案对你有帮助吗,和/或它解决了你最初的问题吗?