Awk跳过第二个字段为空的CSV行

Awk跳过第二个字段为空的CSV行,csv,awk,Csv,Awk,我有一个16GB的CSV,即:-分开,字段总是被引用。我需要快速筛选出第二个字段为空的行 "12345";"987";"..." # keep it "67890";"";"..." # omit it 前两个字段仅为数字,如果这关系到性能的话 我想,awk可能是这方面最有效的工具,但我似乎无法正确使用它。我试过这个,但它错误地省略了大多数行: cat huge.csv | awk '/^"\d+";"\d/' > filtered.csv 当然,它不必是awk;linux和OS

我有一个16GB的CSV,即:-分开,字段总是被引用。我需要快速筛选出第二个字段为空的行

"12345";"987";"..." # keep it
"67890";"";"..."    # omit it
前两个字段仅为数字,如果这关系到性能的话

我想,awk可能是这方面最有效的工具,但我似乎无法正确使用它。我试过这个,但它错误地省略了大多数行:

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

当然,它不必是awk;linux和OS X上常见的任何命令行工具都可以使用。

试试这个:
awk-v'FS=;“”$2 != “\”\“”巨大的.csv>过滤的.csv

说明: awk将文件拆分为记录(默认值:以换行符分隔),记录拆分为记录(默认值:以空格分隔)

-v
选项允许在运行脚本之前设置任何awk变量,
FS
变量是特殊的内置变量,它为字段分隔符指定正则表达式。然后脚本只查看第二个字段(即第二个csv字段),如果它不是空的,它(隐式地)打印整个记录

PS:尽管您的脚本不是惯用的,但它几乎是正确的:正则表达式应该是:
/^“[^”]*”;“\d/
,因此当第一个字段不是数字时,它会匹配一行


PPS:如果您需要按给定的正则表达式筛选行,请使用unix实用程序
grep
grep'^“[^”]*;“[0-9]'mage.csv>filtered.csv
尝试以下操作:
awk-v'FS=;”$2 != “\”\“”巨大的.csv>过滤的.csv

说明: awk将文件拆分为记录(默认值:以换行符分隔),记录拆分为记录(默认值:以空格分隔)

-v
选项允许在运行脚本之前设置任何awk变量,
FS
变量是特殊的内置变量,它为字段分隔符指定正则表达式。然后脚本只查看第二个字段(即第二个csv字段),如果它不是空的,它(隐式地)打印整个记录

PS:尽管您的脚本不是惯用的,但它几乎是正确的:正则表达式应该是:
/^“[^”]*”;“\d/
,因此当第一个字段不是数字时,它会匹配一行


PPS:如果您需要按给定的正则表达式筛选行,请使用unix实用程序
grep
grep'^“[^”]*;“[0-9]”grage.csv>filtered.csv

,除非您知道这一点
从不出现在任何带引号的字段中,您不能为此使用awk。但是,如果满足该标准,您可以执行以下操作:

awk '$2 != "\"\""' FS=\; huge.csv > filtered.csv
这样写可能会更简洁一些:

awk -F\; '$2 !~ /^""$/' huge.csv > filtered.csv

除非你知道,
从不出现在任何带引号的字段中,您不能为此使用awk。但是,如果满足该标准,您可以执行以下操作:

awk '$2 != "\"\""' FS=\; huge.csv > filtered.csv
这样写可能会更简洁一些:

awk -F\; '$2 !~ /^""$/' huge.csv > filtered.csv

另一个解决方案是使用

awk -F\" '$4' 
i、 例如,您的命令是:

awk -F\" '$4' huge.csv > filtered.csv
这将输入字段分隔符设置为
,并检查第四个字段。如果它不为零,则隐式打印该行。给出:

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

使用GNU awk 3.1.6测试另一个解决方案

awk -F\" '$4' 
i、 例如,您的命令是:

awk -F\" '$4' huge.csv > filtered.csv
这会将输入字段分隔符设置为
,并检查第四个字段。如果非零,则隐式打印该行。给出:

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

用GNU awk 3.1.6测试,从技术上讲,awk是图灵完整语言,所以您可以使用它。实际上,如果您使用gawk(现在最常用),您可以将
FPAT
变量设置为FPAT=\“[^”]*\”,但这对引用的引号没有帮助
\”
@Nya:
FPAT
需要gawk 4。从技术上讲,awk是图灵完整语言,所以您可以使用它。实际上,如果您使用gawk(现在最常用),您可以将
FPAT
变量设置为FPAT=\“[^”]*\”,但这对引用的引号没有帮助
\”
@Nya:
FPAT
需要gawk 4。实际上不需要
cat
,这相当于:
awk'/^\d+;“\d/'mage.csv>filtered.csv
并不是真的需要,这相当于:
awk'/^“\d+”;“\d/'mage.csv>filtered.csv
很酷的实用技巧,我经常在我的一行程序中使用类似的技巧。(但它对引用引号(
\“
)没有帮助)@Nya是的,这是问题的一个具体解决方案,所提供的数据,同意。FWIW,我首先尝试了你的方法,但当我得到引用/转义引用时,你已经发布了你的:)所有的解决方案都花费了同样长的时间。我喜欢你的简单。很酷的实用技巧,我经常在我的一行程序中使用类似的技巧。(这对引用引号(
\“
)没有帮助)@Nya是的,这是问题的一个具体解决方案,提供的数据,同意。FWIW,我首先尝试了你的方法,但当我得到引用/转义引用时,你已经发布了你的:)所有解决方案都花了同样长的时间。我喜欢你的简单。与其使用
-v
,不如使用
-F';'
而不是
-v
只需使用
-F';'