0

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

它已经有一个现有的代码:\

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

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

  2. 第二个子包含第一个包含值但第二个为空的文件

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

据我了解,^[^,]+,手段必须以一个值开头,但该值不能是逗号,然后是逗号。

我们有一个新要求,即第五列不能为空白:

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

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

有任何想法吗?

4

2 回答 2

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”,它将评估为假。如果您的数据可能包含“0”但必须评估为真的字段,则可以调整(加长)此脚本以解决此问题。

于 2012-09-05T03:17:36.027 回答
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, 的末尾放置一个空格时。

于 2012-09-05T00:07:49.960 回答