我需要在csv文件中的所有空单元格(没有任何值)中输入一些值(例如)。 如何使用sed完成?1
如果sed无法做到这一点,那么perl可以做到吗?
我认为使用sed、awk或 Perl 一个内衬操作 CSV 文件至少可以说是乐观的。如果格式发生变化,如果其中一个字段包含分隔符怎么办?我建议使用Text::CSV_XS,它非常简单高效。通常,诸如您所要求的简单任务只需要几行代码。给定一个正确配置的Text::CSV_XS
实例 ( $csv
),它只需要:
while ( my $row = $csv->getline( $in ) ) {
my @new_row = map { defined $_ ? $_ : 1 } @$row;
$csv->print( \*STDOUT, \@new_row );
}
如果您仍想直接使用命令行,您可以检查csv (App::CSV),IMO 的方法比上述替代方法更明智。
可以用awk
. 你可以试试:
awk '{for(i=1; i<=NF; i++) if($i=="") $i=1}1' FS=, OFS=, file
阅读拉森的评论,我意识到他是对的,因为 OP 并没有真正发布可以显示引用字段是否会出现的示例。我试图找到一种更简单的更通用的方法来考虑这一点。 .
awk '
{
for(i=1; i<=NF; i++) { # For every field
if($i=="") # it is empty
$i=1 # then make it 1 requirement OP
else {
f=$i # set `f` to the current field
while( gsub(/"/,"&",f )%2 && i<NF ) f=f $(++i) # while the total number of double quotes is odd, keep adding the next field to the current field and ignore it..
}
}
}
1 # print the record
' FS=, OFS=, file # set the I/O field separators to `,`
或者在一行中:
awk '{for(i=1; i<=NF; i++) if($i=="") $i=1; else { f=$i; while( gsub(/"/,"&",f)%2 && i<NF) f=f $(++i)}}1' FS=, OFS=, file
使用此输入进行测试:
,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
怎么样:
$ 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