替换csv文件中的一行?

时间:2009-01-19 22:18:29

标签: linux command-line

我有一组10个CSV文件,通常有一个这样的条目

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

现在由于此文件中的一些错误条目已成为此类

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

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

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

7 个答案:

答案 0 :(得分:5)

这取决于你的意思取代。如果你的意思是'删除',那么@ wnoise解决方案的一个简单变体就是:

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

请注意,这只会删除那些包含三个逗号的行。如果你想用任意数量的逗号(包括零)删除格式错误的行 - 而且行上没有其他字符,那么:

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

正则表达式还有其他无穷无尽的变体可以处理其他场景。使用引号内的逗号处理完整的CSV数据开始需要除正则表达式计算机之外的其他内容。它可以在很宽的范围内完成,特别是在更复杂的正则表达式系统中,如PCRE或Perl。但它需要更多的工作。

查看Mastering Regular Expressions

答案 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 ...

(应该完全按原样输入,包括换行符)。当然,您也可以使用awkperl执行此操作,或者,如果您只删除行,则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;拆分选项。