最初の「,」を除くすべての項目を「に変更します。「ファイルの各行について(bash)[重複]

最初の「,」を除くすべての項目を「に変更します。「ファイルの各行について(bash)[重複]

私はbashを使用しており、データの2つの列(App、Blurb)のみが必要なcsvファイル(dat.csv)がありますが、各行に「、」が多いため、多くの列になります。

問題のあるcsv.datの例:

 App , Blurb
 diff, this is the diff program, bla bla bla, yadda yadda
 word, this is ms product, it is not very good, I dont like it
 dd, this is a Linux disk application , its awesome!, bla bla, ttly
 ... 

私が経験している問題は、「Blurb」列に追加の「」があるため、データがdat.csvファイルの後続の列(c、dなど)にパイプされることです。

目的は、各行の最初の「、」を除くすべての項目を「COMMA」に変更して、すべての「Blurb」データが列Bに保持されるようにすることです。

たとえば、希望の出力は次のようになります。

 App, Blurb                 
 diff, this is the diff program<COMMMA> bla bla bla<COMMA> yadda yadda
 word, this is ms product<COMMA> it is not very good<COMMA> I dont like it
 dd, this is a Linux disk application <COMMA> its awesome!<COMMA>bla bla<COMMA> ttly
 ...

ありがとうございます!

答え1

GNUの使用sed:

sed 's/,/<COMMA>/2g' infile

または移植性のために:

sed 's/,/<COMMA>/g; s/<COMMA>/,/' infile

答え2

また、これを行うことができますPOSIX-ライ次のように:

sed -e '
    y/,/\n/          ;# change all commas to newlines, which are guaranteed to not be there
    s/\n/,/          ;# then change the first of those newlines to a comma, i.e., restore
    s//<COMMA>/g     ;# and all the remaining newline(s) change to <COMMA>
' dat.csv

答え3

たぶん、フィールドの周りに引用符を入れることもできます。これにより、内部のコンマがフィールド区切り文字ではないことをcsvパーサーに通知できます。

sed 's/"/""/g;                         # escape existing " as ""
     s/[[:space:]]*,[[:space:]]*/","/; # replace the first , and the
                                       # whitespace around it with ","

     s/^[[:space:]]*/"/;               # add a " at the start (and
                                       # get rid of whitespace there)

     s/[[:space:]]*$/"/;               # same at the end'

関連情報