使用awk过滤带有引号的CSV文件

时间:2018-03-08 09:48:15

标签: awk

我有一个逗号分隔值的文本文件。 样本行可以是

 "Joga","Bonito",7,"Machine1","Admin"  

“看到的是文本的一部分,在将此csv转换回java对象时需要。” 我想根据csv中的某些字段过滤掉这个文件中的一些行。 以下声明不起作用。

 awk -F "," '($2== "Bonito") {print}' filename.csv  

我猜这与“出现在文本中有关。” 我看到了一个例子:

awk -F "\"*,\"*"  

我不确定这是如何运作的。它看起来像一个正则表达式,但最后的使用*让我感到沮丧。

有没有比我写的最后一个awk语句更好的选择? 它是如何工作的?

2 个答案:

答案 0 :(得分:2)

由于某些参数具有双引号而其他参数没有,因此您可以使用带引号的参数进行过滤:

awk -F, '$2 == "\"Bonito\""' filename.csv

要过滤没有双引号的参数,只需执行:

awk -F, '$3 == 7' filename.csv

另一种方法是在正则表达式中使用双引号(命令?使双引号可选):

 awk -F '"?,"?' '$2 == "Bonito"' filename.csv

但是这有一个缺点,即匹配以下行:

"Joga",Bonito",7,"Machine1","Admin"

答案 1 :(得分:1)

首先通过测试文件:

$ cat file
"Joga","Bonito",7,"Machine1","Admin"
"Joga",Bonito,7,"Machine1","Admin"

使用正则表达式^\"?即。 以双引号开头

$ awk -F, '$2~/^\"?Bonito\"?$/' file
"Joga","Bonito",7,"Machine1","Admin"
"Joga",Bonito,7,"Machine1","Admin"