使用sed填充空CSV字段?

使用sed填充空CSV字段?,csv,sed,perl,awk,Csv,Sed,Perl,Awk,我需要在文件中没有任何值的所有空单元格中输入一些值,例如1。如何使用 如果无法使用,那么可以使用吗?如何: $ cat file v,,v,,,v,v,,,, ,,v,,v,v,,,v,,,v ,,,,,,,,,,,,,, $ sed -e 's/^,/v,/' -e':a;s/,,/,v,/;ta' -e 's/,$/,v/' file v,v,v,v,v,v,v,v,v,v,v v,v,v,v,v,v,v,v,v,v,v,v v,v,v,v,v,v,v,v,v,v,v,v,v,v,v 如

我需要在文件中没有任何值的所有空单元格中输入一些值,例如1。如何使用

如果无法使用,那么可以使用吗?

如何:

$ cat file
v,,v,,,v,v,,,,
,,v,,v,v,,,v,,,v
,,,,,,,,,,,,,,

$ sed -e 's/^,/v,/' -e':a;s/,,/,v,/;ta' -e 's/,$/,v/' file
v,v,v,v,v,v,v,v,v,v,v
v,v,v,v,v,v,v,v,v,v,v,v
v,v,v,v,v,v,v,v,v,v,v,v,v,v,v
如果您对更改感到满意,请使用-i选项将更改存储回文件

$ sed -i -e 's/^,/v,/' -e':a;s/,,/,v,/;ta' -e 's/,$/,v/' file
这可以用awk来完成。你可以试试:

awk '{for(i=1; i<=NF; i++) if($i=="") $i=1}1' FS=, OFS=, file
制作:

1,1997,Ford,1,"Super, ""luxurious"" ,,,truck",1,1
0,1997,Ford,1,"Super, ""luxurious"" ,,,truck",1,1,1,1

我认为,至少可以说,用Perl或一行程序处理CSV文件是乐观的。如果格式改变了怎么办?如果其中一个字段包含分隔符怎么办?我建议使用,这是非常简单和有效的。通常,简单的任务,比如你要的东西,只需要几行字。给定一个正确配置的Text::CSV_XS实例$CSV,只需要:

while ( my $row = $csv->getline( $in ) ) {
  my @new_row = map { defined $_ ? $_ : 1 } @$row;
  $csv->print( \*STDOUT, \@new_row );
}

如果您仍然想直接使用命令行,您可以检查哪个IMO的方法比上述替代方法更明智。

可能,但这取决于您所说的“输入空单元格”是什么意思?你能提供输入的数量和预期的输出吗?谢谢!还没有想到这个简单的解决方案:太好了,如果你对这个答案满意,请接受并投票。@user1240622:表达感谢的标准方式!这里是+1:对于这种方法,即使没有被要求,它可能是最好的方法。我用一个awk版本修改了我的帖子,试图将引号考虑在内。+1指出输入文件规范不明确。。我用一个awk版本修改了我的帖子,该版本试图考虑引用。。
,1997,Ford,,"Super, ""luxurious"" ,,,truck",,
0,1997,Ford,,"Super, ""luxurious"" ,,,truck",,,,
1,1997,Ford,1,"Super, ""luxurious"" ,,,truck",1,1
0,1997,Ford,1,"Super, ""luxurious"" ,,,truck",1,1,1,1
while ( my $row = $csv->getline( $in ) ) {
  my @new_row = map { defined $_ ? $_ : 1 } @$row;
  $csv->print( \*STDOUT, \@new_row );
}