2

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

我已经设法使用以下命令找到要删除逗号的部分,但我不知道如何在 \1 上执行 s/,//g 和 s/"//g。

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"#

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

杰克

4

2 回答 2

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
于 2013-02-13T00:51:54.987 回答
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)
于 2013-02-12T21:49:20.027 回答