sed - 如何仅在csv文件中的行的匹配部分上替换字符串?

时间:2013-02-12 21:45:46

标签: perl unix sed

我有一个包含以下行的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"#

真的很感激,如果有人可以在这里提供帮助。

杰克

2 个答案:

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