私は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'