【问题标题】:CSV file cleanup in bashbash 中的 CSV 文件清理
【发布时间】:2017-04-08 23:51:03
【问题描述】:

我有一个用“,”分隔的 CSV 文件,我想将其用于在 postgres 数据库中进行进一步处理,但并非所有行都有正确的列数。

我正在寻找一种方法来删除所有没有指定数量 (15) 分隔符的行。

我见过很多 sed/awk 解决方案,但没有一个能完全满足我的需求。谢谢!

【问题讨论】:

  • 试试awk -F, 'NF==15' file.csv
  • @Sundeep :那些该死的错误;)
  • @EricDuminil 是的...如果需要的分隔符数量是 15,则应该是 NF==16.. 将其与字段数量混淆...
  • 谢谢!我已经一一尝试了以下所有解决方案,并且都奏效了:)。

标签: linux bash csv awk sed


【解决方案1】:

你可以使用 Perl one-liner 来处理文件:

$ perl -lane '$c = $_ =~ tr/,//; print $_ if $c == 14' input_file.csv > output_file.csv

这将读取来自input_file.csv的所有行,如果一行包含15个逗号,它将将该行打印到output_file.csv

【讨论】:

  • 为什么不更简单的perl -F, -ane 'print if $#F == 14'
  • TIMTOWTDI :) 肯定也会起作用,而且会更快。
【解决方案2】:

我认为这应该可行:

grep -e '^[^,]*\(,[^,]*\)\{15\}$' data.csv

或者用红宝石:

ruby -ne 'print if $_.count(",")==15' < data.csv

【讨论】:

  • 也可以使用-x选项来指定行匹配而不是^$
【解决方案3】:

在 awk 中。将,替换为另一个,,计算代数并打印适量:

$ awk 'gsub(/,/,",")==15' file

由于没有测试数据,所以没有输出。你只需要相信我。

【讨论】:

    【解决方案4】:
    awk -F, 'NF!=16' file
    

    更多字符。

    【讨论】:

    • 这个实际上打印出我不想要的所有行,但这也很方便。谢谢!
    • 是的,当您在要求中使用双重否定 **deleting** all lines which **don't** have a specified number (15) of delimiters 并且不显示示例输入/输出时,很容易让我们感到困惑。如果您以积极的方式 (print all lines that have a specified number (15) of delimiters) 编写您的要求,那么它的混淆就会少得多,如果您包含示例输入/输出,则根本不会有混淆的机会。
    【解决方案5】:
    awk -v FS=',' 'NF==16' <csv>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-04
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2021-12-27
      • 2019-05-28
      • 1970-01-01
      相关资源
      最近更新 更多