以下の値の例を含むCSVファイルがあります。
"Basic","""21,21""","[""21"",""21""]","","","","",""
2および3などの一部の列から追加の二重引用符を削除する必要があります。
期待される出力は次のとおりです
"Basic","21,21","[21,21]","","","","",""
awk、sed、または他のLinuxツールを使用してこれをどのように達成できますか?
以下にファイルの例を示します。この列の値は常に[]にあり、[]内の引用符を削除する必要があります。
"Basic","""40""","[""40""]","""13F""","[""13F""]","",""
"Basic","""0""","[""0""]","","","""MCOMB""","[""MCOMB""]"
答え1
答え2
答え3
sed
解決策があります。
sed -e 's/,"""/,"/g' -e 's/""",/",/g' -e 's/\([^,]\)""/\1/g' -e 's/""\([^,]\)/\1/'
これは作る
"Basic","40","[40]","13F","[13F]","",""
"Basic","0","[0]","","","MCOMB","[MCOMB]"
"Basic","21,21","[21,21]","","","","",""
sedコマンドはとても簡単です。
's/,"""/,"/g'
次の項目をすべて,"""
置き換えます。,"
g
's/\([^,]\)""/\1/g'
非カンマ文字[^,]
と2つの"
記憶文字を検索し、\( \)
記憶文字に置き換えます。\1
行末の末尾のスペースは、最後のスペースを削除します。""
@casが指摘したように、csvツールを使用すると長期的には良いでしょう。
答え4
データからすべての二重引用符、つまりCSV形式の二重引用符と、引用符、カンマ、および改行を引用するのに必要な二重引用符ではなく、すべての二重引用符を削除するとします。
csvformat
csvkit を使用してtr
各フィールドの内部参照を削除します。
$ cat file
"Basic","""40""","[""40""]","""13F""","[""13F""]","",""
"Basic","""0""","[""0""]","","","""MCOMB""","[""MCOMB""]"
"Basic","""21,21""","[""21"",""21""]","","","","",""
$ csvformat -Q "'" file | tr -d '"' | csvformat -q "'"
Basic,40,[40],13F,[13F],,
Basic,0,[0],,,MCOMB,[MCOMB]
Basic,"21,21","[21,21]",,,,,
上記のパイプラインは、まずCSVファイルで使用されている引用符文字を二重引用符から一重引用符に変更します。このtr
コマンドは、残りの二重引用符(部分データ)をすべて削除します。最後のcsvformat
コマンドは、データを二重引用符を使用して再変換します。
空のフィールドを含むすべてのフィールドを参照する必要がある場合は、2番目の呼び出しに追加して-U 1
くださいcsvformat
。デフォルトでは、csvkitユーティリティは必要なフィールドに対してのみ引用符を出力します。