通过egrep过滤CSV中的值

时间:2012-09-04 23:37:44

标签: linux grep

我有一个CSV文件需要将值分隔成单独的CSV文件。

它已有一个现有代码:\

  1. 第一个子文件需要一个包含第一和第二个字段值的文件

    egrep "^[^,]+,[^,]+," orig.csv > suba.csv

  2. 第二个子包含第一个包含值但第二个

    中为空的文件

    egrep "^[^,]+,," orig.csv > subb.csv

  3. 根据我的理解,^[^,]+,表示必须以值开头,但值不能是逗号,后面跟逗号。

    我们有一项新要求,即第五栏不得为空白:

    这是我认为应该是的,但不幸的是它仍然收到第五列没有值的值

    egrep "^[^,]+,[^,]+,[^,]+,[^,]+,[^,]+" orig.csv > suba_2.csv
    

    有什么想法吗?

2 个答案:

答案 0 :(得分:1)

尝试:

egrep "^[^,]+,[^,]+,[^,]+,[^,]+,[^, ]+" orig.csv

我怀疑你的第五个元素中有空格。

你的正则表达式对我有用,输入如下:

% cat orig.csv
1,2,3,4,5,6,7,8,9,10
1,2,3,4,,6,7,8,9,10
1,2,3,4,5
1,2,3,4,
% egrep "^[^,]+,[^,]+,[^,]+,[^,]+,[^,]+" orig.csv
1,2,3,4,5,6,7,8,9,10
1,2,3,4,5
% 

但是当我在最后一行1,2,3,4,...

的末尾放置一个空格时

答案 1 :(得分:1)

是否有理由不能使用awk

$ awk -F, '{out="subb.csv"} $2{out="suba.csv"} $5{print > out}' orig.csv

这是如何运作的?

让我们分解一下:

  • -F,将分隔符设置为逗号。
  • {out="subb.csv"}设置默认输出文件。
  • $2{out="suba.csv"}测试第二个字段。如果它不为空,则设置不同的输出文件。
  • $5{print > out}测试第五个字段是否为空,如果不是,则将输出打印到之前指定的输出文件。

请注意,这些简单的“空”测试并不完全是万无一失的。如果字段为“0”,则评估为false。如果您的数据可能包含“0”但必须评估为true的字段,则可以调整(延长)此脚本以解决此问题。