我有一个逗号分隔值的文本文件。 样本行可以是
"Joga","Bonito",7,"Machine1","Admin"
“看到的是文本的一部分,在将此csv转换回java对象时需要。” 我想根据csv中的某些字段过滤掉这个文件中的一些行。 以下声明不起作用。
awk -F "," '($2== "Bonito") {print}' filename.csv
我猜这与“出现在文本中有关。” 我看到了一个例子:
awk -F "\"*,\"*"
我不确定这是如何运作的。它看起来像一个正则表达式,但最后的使用*让我感到沮丧。
有没有比我写的最后一个awk语句更好的选择? 它是如何工作的?
答案 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"