我有一组10个CSV文件,通常有一个这样的条目
a,b,c,d
d,e,f,g
现在由于此文件中的一些错误条目已成为此类
a,b,c,d
d,e,f,g
,,,
h,i,j,k
现在我想删除所有文件中只有逗号的行。这些文件位于Linux文件系统上。
您建议的任何命令都可以替换所有文件中的错误行。
答案 0 :(得分:5)
这取决于你的意思取代。如果你的意思是'删除',那么@ wnoise解决方案的一个简单变体就是:
grep -v '^,,,$' old-file.csv > new-file.csv
请注意,这只会删除那些包含三个逗号的行。如果你想用任意数量的逗号(包括零)删除格式错误的行 - 而且行上没有其他字符,那么:
grep -v '^,*$' ...
正则表达式还有其他无穷无尽的变体可以处理其他场景。使用引号内的逗号处理完整的CSV数据开始需要除正则表达式计算机之外的其他内容。它可以在很宽的范围内完成,特别是在更复杂的正则表达式系统中,如PCRE或Perl。但它需要更多的工作。
答案 1 :(得分:2)
sed 's/,,,/replacement/' < old-file.csv > new-file.csv
可选地随后 mv new-file.csv old-file.csv
答案 2 :(得分:1)
更换或移除,您的帖子不清楚......如需更换,请参阅wnoise的回答。要删除,您可以使用
awk '$0 !~ /,,,/ {print}' <old-file.csv > new-file.csv
答案 3 :(得分:1)
您想要用某些东西替换它们,还是完全删除它们?无论哪种方式,都可以使用sed
完成。要删除:
sed -i -e '/^,\+$/ D' yourfile1.csv yourfile2.csv ...
要替换:嗯,请参阅wnoise的答案,或者如果您不想使用输出创建新文件,
sed -i -e '/^,\+$/ s//replacement/' yourfile1.csv yourfile2.csv ...
或
sed -i -e '/^,\+$/ c\
replacement' yourfile1.csv yourfile2.csv ...
(应该完全按原样输入,包括换行符)。当然,您也可以使用awk
或perl
执行此操作,或者,如果您只删除行,则grep
:
egrep -v '^,+$' < oldfile.csv > newfile.csv
我测试了这些以确保它们有效,但我建议你在使用它们之前做同样的事情(以防万一)。您可以省略-i
中的sed
选项,在这种情况下它会打印出结果(而不是将它们写回文件),或者忽略>newfile.csv
的输出重定向grep
{1}}。
编辑:评论中指出,这些sed
命令的某些功能仅适用于GNU sed
。据我所知,这些是-i
选项(可以用shell重定向替换,sed ... <infile >outfile
)和\+
修饰符(可以用\{1,\}
替换)。
答案 4 :(得分:1)
尝试仅保留与所需格式匹配的行而不是处理一个异常怎么样?
如果提供的输入是您真正想要匹配的内容:
grep -E '[a-z],[a-z],[a-z],[a-z]' < oldfile.csv > newfile.csv
如果输入不同,请提供它,正则表达式不应该太难写。
答案 5 :(得分:1)
最简单:
$ grep -v ,,,, oldfile > newfile
$ mv newfile oldfile
答案 6 :(得分:0)
是的,如果你在linux平台上工作,awk或grep是非常好的选择。但是,您可以将perl regex用于其他平台。使用join&amp;拆分选项。