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

时间:2012-08-14 22:18:41

标签: csv awk

我有一个16GB的CSV; -seperated和字段总是被引用。我需要快速过滤掉第二个字段为空的行。

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

前两个字段仅为数字,如果这对性能有影响。

我认为,awk可能是最适合这种情况的工具,但我似乎无法做到这一点。我尝试过这个,但它错误地省略了大多数行:

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

当然它不一定是awk; Linux和OS X上常见的任何命令行工具都可以。

3 个答案:

答案 0 :(得分:3)

另一种解决方案只需使用

awk -F\" '$4' 

即你的命令是:

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

这会将输入字段分隔符设置为"并检查第4个字段。如果它不为零,则隐式打印该行。给出:

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

使用GNU awk 3.1.6进行测试

答案 1 :(得分:1)

试试这个:awk -v 'FS=;' '$2 != "\"\""' huge.csv > filtered.csv

<强>解释: awk将文件拆分为记录(默认值:由换行符分隔),并将记录拆分为记录(默认值:按空格)。

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

PS:即使你的脚本是非惯用的,它几乎是正确的:正则表达式应该是:/^"[^"]*";"\d/,所以当第一个字段是非数字时,它匹配一行。

PPS:如果您需要按给定的正则表达式过滤行,请使用unix实用程序grepgrep '^"[^"]*";"[0-9]' huge.csv > filtered.csv

答案 2 :(得分:1)

除非您知道;永远不会出现在任何引用字段中,否则您无法使用awk。但是,如果符合该标准,您可以执行以下操作:

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

将其写成:

可能会更清晰一些
awk -F\; '$2 !~ /^""$/' huge.csv > filtered.csv