Awk跳过第二个字段为空的CSV行
我有一个16GB的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
"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';'代码>