我有一个CSV文件需要将值分隔成单独的CSV文件。
它已有一个现有代码:\
第一个子文件需要一个包含第一和第二个字段值的文件
egrep "^[^,]+,[^,]+," orig.csv > suba.csv
第二个子包含第一个包含值但第二个
中为空的文件 egrep "^[^,]+,," orig.csv > subb.csv
根据我的理解,^[^,]+,
表示必须以值开头,但值不能是逗号,后面跟逗号。
我们有一项新要求,即第五栏不得为空白:
这是我认为应该是的,但不幸的是它仍然收到第五列没有值的值
egrep "^[^,]+,[^,]+,[^,]+,[^,]+,[^,]+" orig.csv > suba_2.csv
有什么想法吗?
答案 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的字段,则可以调整(延长)此脚本以解决此问题。