在csv文件(正则表达式)行中计算逗号的确切数量

时间:2017-12-01 12:44:06

标签: regex linux grep

我有一个csv文件(25GB),但它已损坏。它通常有47个列由46个逗号和一个起始逗号分隔,所以47个,但有些行有49列。我想从文件中删除那些行,我想我会在另一个问题中找到grep和正则表达式:

grep -vE '/^([^,]*,){47}[^,]*$/' file1 > file2

知道我缺少什么吗?

3 个答案:

答案 0 :(得分:2)

$ printf 'a,b,c\n1,2\n'
a,b,c
1,2

$ # -x option forces entire line to be matched
$ printf 'a,b,c\n1,2\n' | grep -xE '([^,]*,){2}[^,]*'
a,b,c
$ printf 'a,b,c\n1,2\n' | grep -xE '([^,]*,){1}[^,]*'
1,2

$ # you can also use awk, NF contains number of fields
$ printf 'a,b,c\n1,2\n' | awk -F, 'NF==3'
a,b,c
$ printf 'a,b,c\n1,2\n' | awk -F, 'NF==2'
1,2

答案 1 :(得分:1)

可能是最简单的:

awk -F , 'NF==47' file1 >file2

对于复杂的CSV文件,这显然不能正常工作,其中某些字段可能包含双引号内的逗号,而这些逗号根本不是分隔符(...尽管这可能与您的数据完全相同)。

答案 2 :(得分:0)

您描述了一个"起始逗号",因此您的正则表达式需要考虑到这一点。

grep -vE "^,([^,]*,){46}[^,]*$" file1 > file2

或者更好......

grep -vE "^(,[^,]*){47}$" file1 > file2