我有一个包含以下行的csv文件:
23000747,,2015582,-375080.2254,-375080,-375080
23000749,,SA1555,"-30,448,276","-30,448,456","-30,448,239"
我想从所有引用的列中删除双引号和逗号,以便结果如下所示:
23000747,,2015582,-375080.2254,-375080,-375080
23000749,,SA1555,-30448276,-30448456,-30448239
我已经设法能够使用下面的命令找到我想要删除逗号的部分,但我无法弄清楚如何做s /,// g和s /“// g on \ 1。
sed 's/\("[-,0-9]*"\)/#\1#/g' 1.txt
23000747,,2015582,-375080.2254,-375080,-375080
23000749,,SA1555,#"-30,448,276"#,#"-30,448,456"#,#"-30,448,239"#
真的很感激,如果有人可以在这里提供帮助。
杰克
答案 0 :(得分:1)
对于此特定任务,shell是有限的。像Perl这样的高级文本操作语言更适合使用CSV解析器,请参阅:
my $file = "/path/to/file.csv";
use strict; use warnings;
use feature qw/say/;
use Text::CSV;
my $csv = Text::CSV->new()
or die "Cannot use CSV: ".Text::CSV->error_diag();
open my $fh, "<:encoding(utf8)", $file
or die "$file: $!";
while (my $row = $csv->getline($fh)) {
map { tr/,// } @$row;
say join ",", @$row;
}
$csv->eof or $csv->error_diag();
close $fh;
如果您需要删除特定列上的逗号,请替换
map { tr/,// } @$row;
通过
map { tr/,// } @$row[3..5]; # array slice (columns N-1)
答案 1 :(得分:1)
sed
不适合您的工作。您可以使用Perl和Text::CSV module
,但如果您有GNU awk
,则可以使用FPAT
变量:
awk 'BEGIN { FPAT = "([^,]*)|(\"[^\"]+\")"; OFS="," } { for (i=1; i<=NF; i++) gsub(/[\",]/,"", $i) }1'
结果:
23000747,,2015582,-375080.2254,-375080,-375080
23000749,,SA1555,-30448276,-30448456,-30448239