【发布时间】:2009-01-19 22:18:28
【问题描述】:
我有一组 10 个 CSV 文件,通常有一个此类条目
a,b,c,d
d,e,f,g
现在由于这个文件中的一些错误条目变成了这种类型
a,b,c,d
d,e,f,g
,,,
h,i,j,k
现在我想删除所有文件中只有逗号的行。这些文件位于 Linux 文件系统上。
您推荐的任何可以替换所有文件中错误行的命令。
【问题讨论】:
标签: 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 文件系统上。
您推荐的任何可以替换所有文件中错误行的命令。
【问题讨论】:
标签: linux command-line
这取决于您所说的替换。如果您的意思是“删除”,那么@wnoise 解决方案的一个简单变体是:
grep -v '^,,,$' old-file.csv > new-file.csv
请注意,这只会删除恰好包含三个逗号的行。如果您想删除包含任意数量的逗号(包括零)且没有其他字符的格式错误的行,则:
grep -v '^,*$' ...
正则表达式还有无穷无尽的其他变体可以处理其他场景。使用引号内的逗号处理完整的 CSV 数据开始需要除正则表达式机器之外的其他东西。它可以在广泛的范围内完成,尤其是在 PCRE 或 Perl 等更复杂的正则表达式系统中。但这需要更多的工作。
【讨论】:
sed 's/,,,/replacement/' < old-file.csv > new-file.csv
可选地后跟 mv new-file.csv old-file.csv
【讨论】:
替换或删除,您的帖子不清楚...有关替换,请参阅 wnoise 的答案。对于删除,您可以使用
awk '$0 !~ /,,,/ {print}' <old-file.csv > new-file.csv
【讨论】:
尝试只保留与所需格式匹配的行而不是处理一个异常呢?
如果提供的输入是您真正想要匹配的:
grep -E '[a-z],[a-z],[a-z],[a-z]' < oldfile.csv > newfile.csv
如果输入不同,提供,正则表达式应该不会太难写。
【讨论】:
您想用某些东西替换它们,还是完全删除它们?无论哪种方式,都可以使用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
我测试了这些以确保它们有效,但我建议您在使用它们之前也这样做(以防万一)。您可以从sed 中省略-i 选项,在这种情况下它将打印出结果(而不是将它们写回文件),或者从grep 中省略输出重定向>newfile.csv。
编辑:评论中指出,这些sed 命令的某些功能仅适用于GNU sed。据我所知,这些是 -i 选项(可以替换为 shell 重定向 sed ... <infile >outfile )和 \+ 修饰符(可以替换为 \{1,\} )。
【讨论】:
最简单的:
$ grep -v ,,,, oldfile > newfile
$ mv newfile oldfile
【讨论】:
是的,如果您在 linux 平台上工作,awk 或 grep 是非常好的选择。但是,您可以将 perl 正则表达式用于其他平台。使用连接和拆分选项。
【讨论】: