【问题标题】:When using awk to parse a CSV file, why does it ignore empty cells?使用 awk 解析 CSV 文件时,为什么会忽略空单元格?
【发布时间】:2012-05-01 03:04:22
【问题描述】:

我有一些使用awk 解析CSV 文件的脚本。我注意到,如果一个单元格是空的,awk 只是移动到下一个单元格。这意味着,如果我要求它读取第 4 列,但该单元格是空的,它会打印第 5 列中的数据,例如:

echo "1@2@3@@5" | awk -F "@*" '{print $4}'

我的预期结果是它不会打印任何内容,因为第 4 列是空的。

  • 为什么awk 跳过第 4 列?
  • 如何让awk 不忽略空列?

【问题讨论】:

    标签: bash csv awk


    【解决方案1】:

    问题不是你想的那样。 awk 没有忽略空单元格;它将该行解析为 4 个字段而不是 5 个。

    [me@home]$ echo "1@2@3@@5" | awk -F "@*" '{print NF}'
    4
    

    这是因为您使用 @* 作为字段分隔符,这允许一个或多个连续的 @ 作为您的字段分隔符(@@@@@@、...都是有效的字段分隔符)。

    尝试改用-F "@"

    [me@home]$ echo "1@2@3@@5" | awk -F "@" '{print NF}'
    5
    [me@home]$ echo "1@2@3@@5" | awk -F "@" '{print $4}'
    
    [me@home]$ echo "1@2@3@@5" | awk -F "@" '{print $5}'
    5
    

    【讨论】:

    • awk 实际上在这里很友善,忽略了正则表达式的空匹配。因为正则表达式可以为空(匹配空字符串),所以输入行“1234@@5”应该,严格来说,实际上应该拆分为字段 1、2、3、4、5。或者甚至可能在开头有一个额外的空字段并结束。毕竟,正则表达式匹配字符串中的每个位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2011-05-11
    • 2019-09-27
    • 2016-05-04
    • 2016-05-08
    相关资源
    最近更新 更多