【问题标题】:Using awk to filter a CSV file with quotes in it使用 awk 过滤包含引号的 CSV 文件
【发布时间】:2018-03-08 18:17:59
【问题描述】:

我有一个带有逗号分隔值的文本文件。 示例行可以类似于

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

看到的 " 是文本的一部分,当此 csv 转换回 java 对象时需要它。
我想根据 csv 中的某些字段从该文件中过滤掉一些行。 以下语句不起作用。

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

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

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

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

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

【问题讨论】:

标签: awk


【解决方案1】:

由于有些参数有双引号,有些没有,你可以用带引号的参数过滤:

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    首先通过测试文件多一点:

    $ 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"
    

    【讨论】:

    • 为什么需要 ~/ ?
    • $2 == "foo" 匹配整个字段,$2 ~ /foo/ 表示正则表达式匹配。 $2=="foo"$2 ~ /^foo$/ 相同。
    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 2011-03-09
    • 2021-05-08
    • 2022-01-23
    • 1970-01-01
    • 2022-11-25
    • 2016-10-22
    • 2017-11-10
    相关资源
    最近更新 更多