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

この特定のタスクでは、シェルが制限されます。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 に答える
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 に答える