【问题标题】:Matching pattern with a comma embedded in csv column在 csv 列中嵌入逗号的匹配模式
【发布时间】:2016-04-26 17:29:50
【问题描述】:

我有一个日常脚本,需要在上传到数据库之前从主 csv 文件中提取错误日志并删除用户。 我可以使用 awk 来提取第一列,结果很好。但是,我从第 3 方应用程序返回的错误在错误列中包含一个逗号。这会阻止完全匹配并导致问题。

这是我返回的错误文件示例

"USER_ID","FIRSTNAME","LASTNAME","ERROR"
"CA781558","Dani","Roper","parent is inactive, cannot update record"
"BT055163","Alexis","Richardo","parent is inactive, cannot update record"
"LN764767","Peter","Rajosz","no parent record, update denied"
"SG839717","Jerry","Alindos","parent is inactive, cannot update record"

我需要完全匹配“parent is inactive, cannot update record”,用它来更新父记录,这样才能更新。 同样,我需要匹配“无父记录”,以便我可以为此记录和进程添加父级。 实际上,我有大量需要不同操作的类似错误消息。用逗号匹配准确的字符串是至关重要的。

预期的输出是:

"USER_ID"
"CA781558"
"BT055163"
"SG839717"

【问题讨论】:

  • 使用具有适当 CSV 解析器的语言。

标签: linux bash csv


【解决方案1】:

使用awk 你可以这样做:

s='parent is inactive, cannot update record'
awk -v s="\"$s\"" -F, 'NR==1 || $0 ~ s{print $1}' file

"USER_ID"
"CA781558"
"BT055163"
"SG839717"

【讨论】:

    【解决方案2】:

    只需使用它(awk 用于此目的是多余的):

    cat infile.txt | grep 'parent is inactive, cannot update record' | cut -d ',' -f1
    

    【讨论】:

      【解决方案3】:

      我会使用合适的 csv 解析器。以下是使用核心模块Text::ParseWords 的示例,因此您无需从 CPAN 下载它。

      perl -MText::ParseWords -lne '
          @line = parse_line(",", 1, $_);
          print $line[0] if $.==1;
          print $line[0] if $line[3] =~ /parent is inactive, cannot update record/;
      ' file
      "USER_ID"
      "CA781558"
      "BT055163"
      "SG839717"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-18
        • 2015-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 2016-11-19
        • 1970-01-01
        相关资源
        最近更新 更多