2009-01-19 79 views
1

我有一套10个CSV文件,通常有这种替换csv文件中的一行?

a,b,c,d 
d,e,f,g 

现在的一个条目,由于在该文件中的一些错误条目已成为这种现在

a,b,c,d 
d,e,f,g 
,,, 
h,i,j,k 

我想要删除所有文件中只有逗号的行。这些文件位于Linux文件系统上。

您推荐的任何命令都可以替换所有文件中的错误行。

回答

5

这取决于你的意思是替换。如果你的意思是“删除”,然后在@ wnoise的解决方案一个简单的变体是:

grep -v '^,,,$' old-file.csv > new-file.csv 

注意,这个只删除那些恰好三个逗号线。如果你想与任意数量的逗号(包括零)的删除恶意形成的线 - 和线路上无其他字符,则:

grep -v '^,*$' ... 

还有一些对将处理其他情况下,正则表达式无尽的其他变化。用引号内的逗号处理完整的CSV数据开始需要除正则表达式之外的东西。它可以在广泛的范围内完成,特别是在更复杂的正则表达式系统(如PCRE或Perl)中。但它需要更多的工作。

结账Mastering Regular Expressions

2
sed 's/,,,/replacement/' < old-file.csv > new-file.csv 

任选随后 MV新FILE.CSV老FILE.CSV

+0

O.M.G!踢它'老skool!它让我感觉到了ooolllldddd。 :-) – 2009-01-19 22:26:07

+0

不会删除该行...请参阅David的更好地使用sed – orip 2009-01-19 23:01:05

+0

它要求替换,而不是在我回答时删除。 – wnoise 2009-01-20 00:57:43

1

替换或删除,您的文章是不明确......对于更换看到wnoise的答案。对于删除,你可以使用

awk '$0 !~ /,,,/ {print}' <old-file.csv > new-file.csv 
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 ... 

(应完全按照原样输入,包括换行符)。当然,你也可以用awkperl做到这一点,或者,如果你只是删除线,甚至grep

egrep -v '^,+$' <oldfile.csv> newfile.csv 

我测试了这些,以确保他们的工作,但我建议你做在使用它们之前相同(以防万一)。您可以从sed省略-i选项,在这种情况下,它会打印出结果(而不是将它们写回文件),或者从grep省略输出重定向>newfile.csv

编辑:在评论中指出,这些sed命令的某些功能仅适用于GNU sed。据我所知,这些是-i选项(可以用shell重定向,sed ... <infile >outfile替换)和\+修改器(可以用\{1,\}替换)。

1

试图只保留符合所需格式的行而不是处理一个异常的情况如何?

如果所提供的输入是你真的想匹配的内容:

grep -E '[a-z],[a-z],[a-z],[a-z]' <oldfile.csv> newfile.csv 

如果输入不同的是,它提供的正则表达式不应该太难写。

1

最简单的:

$ grep -v ,,,, oldfile > newfile 
$ mv newfile oldfile 
0

是,AWK或者grep的都是很不错的选择,如果你是在Linux平台上工作。但是,您可以使用Perl的正则表达式为其他平台。使用加入&拆分选项。