CSVのデータ内のカンマを削除

[code]

    A,"100",Z
    B,"1,000",Z
    C,"1,000,000",Z
    
[/code]

↓

[code]

    A,"100",Z
    B,"1000",Z
    C,"1000000",Z
    
[/code]

に変更したいのですが、sed,awk,linux等ではどのようにするのでしょうか？




Gawk 4.0以降が使えるなら, gawk の FPAT で処理できるようです. ただし, 改行やダブルクオートが含まれているケースには未対応です.

[code]

    $ gawk -v OFS=, -vFPAT='([^,]*)|("[^"]+")' '{for(i=1;i<=NF;i++){if($i~/^[ \t]*"/){gsub(",","",$i)}}; print}'
    
[/code]

[Defining Fields by
Content](https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-
Content.html)とmetropolisさんのコメントを参考にして, 0文字のフィールドにも対応するため, `([^,]+)` の箇所を
`([^,]*)` にしました.

Gawk-4以前しか使えない環境であれば, awkよりも, Cが書きやすいと思います.  
こちらは改行やダブルクオートにも対応しています.

[code]

    #include <stdio.h>
    static int parse_element_quoted()
    {
     int c;
     while((c=getchar())!=EOF) {
      switch (c) {
       case '"':
        c = getchar();
        if(c=='"') {
         // 「"」2個連続するのは元のデータに「"」が1個ある場合.
         // putchar('"'); 「""」から「"」に変換するときはこの行は不要
         putchar('"');
         break;
        }
        else {
         putchar('"'); // 「"」を取るなら不要 (A)
         putchar(c);
         return 0;
        }
       case '\r':
       case '\n':
       // case '\\':
       case ',':
        // ignore (remove) them
        break;
       default:
        putchar(c);
      }
     }
     return 1;
    }
    static int parse_element()
    {
     int c = getchar();
     if(c==EOF)
      return 1;
     else if(c=='"') { 
      putchar('"'); // 「"」を取るなら不要 (B)
      return parse_element_quoted();
     }
     else {
      putchar(c);
      if(c=='\n' || c==',')
       return 0;
      while((c=getchar())!=EOF) {
       switch (c) {
        case ',':
        case '\n':
         putchar(c);   
         return 0;
        case '\r':
         break;
        default:
         putchar(c);   
       }
      }
      return 1;
     }
    }
    int main()
    {
     while(parse_element()==0);
     return 0;
    }
    
[/code]

個人的には, 「,」を削除して一緒に「"」も削除したほうが, 後の処理が楽だと思います.  
その場合は, 上記コードの(A)と(B)の行をコメントアウトしてください.

