我有一个16GB的CSV; -seperated和字段总是被引用。我需要快速过滤掉第二个字段为空的行。
"12345";"987";"..." # keep it
"67890";"";"..." # omit it
前两个字段仅为数字,如果这对性能有影响。
我认为,awk可能是最适合这种情况的工具,但我似乎无法做到这一点。我尝试过这个,但它错误地省略了大多数行:
cat huge.csv | awk '/^"\d+";"\d/' > filtered.csv
当然它不一定是awk; Linux和OS X上常见的任何命令行工具都可以。
答案 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实用程序grep
:grep '^"[^"]*";"[0-9]' huge.csv > filtered.csv
答案 2 :(得分:1)
除非您知道;
永远不会出现在任何引用字段中,否则您无法使用awk。但是,如果符合该标准,您可以执行以下操作:
awk '$2 != "\"\""' FS=\; huge.csv > filtered.csv
将其写成:
可能会更清晰一些awk -F\; '$2 !~ /^""$/' huge.csv > filtered.csv