我有一个csv文件(25GB),但它已损坏。它通常有47个列由46个逗号和一个起始逗号分隔,所以47个,但有些行有49列。我想从文件中删除那些行,我想我会在另一个问题中找到grep和正则表达式:
grep -vE '/^([^,]*,){47}[^,]*$/' file1 > file2
知道我缺少什么吗?
答案 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