CSVフィールドから埋め込まれた改行を削除する方法

CSVフィールドから埋め込まれた改行を削除する方法

ファイルのために悩んでいます。通常、ホストごとに1行を定義する必要があります。しかし、時々、誰かがいくつかのフィールドを別の行に分割することがあります。例は次のとおりです。

"host1","host1","linux
server",""
"host2","host2","linux server",""

今、私はこの問題を解決する方法(bashでより良い方法)を見つけたいと思います。

"host1","host1","linux server",""
"host2","host2","linux server",""

各フィールドは二重引用符で囲む必要があります。そうでない場合は、\naが挿入されてからそれを削除して、行ごとに常に4つのフィールドがあることを意味します。

説明を複数行に分けることができます。たとえば、次のようになります。

"host1","host1","linux
server
centos",""
"host2","host2","linux server",""

awk私は次のようないくつかのアプローチを試しました。

awk 'BEGIN {ORS=""; RS="\"\n\""; FS="\",\""; OFS="\",\""} {if (NF == 3) print "\"" $1 "\"," $2 "\"," $3 "\"\n"; else printf "%s", $0} END {print ""}' /tmp/ngr4

しかし、私は成功しなかったし、この強力なツールは限界に達し始めました。

ベストアンサー1

使用ミラー( mlr)、さまざまな構造化文書形式のCSVサポートを備えた多目的処理ユーティリティで、すべてのフィールドでスペースをクリーンアップするために使用されます。

$ cat file
"host1","host1","linux
server",""
"host2","host2","linux server",""
$ mlr --csv -N clean-whitespace file
host1,host1,linux server,
host2,host2,linux server,

データをfileヘッダーなしのCSVレコードに読み込み、適用します。clean-whitespace仕事すべて。このclean-whitespace操作は、各フィールド値から横のスペースを切り取り、連続したスペース文字を単一のスペースに結合します。

に変更改行を空白にのみ変更してください、短いステートメントを使用してフィールドを繰り返すことができます。put表現する:

$ mlr --csv -N put 'for (k,v in $*) { $[k] = gssub(v, "\n", " ") }' file
host1,host1,linux server,
host2,host2,linux server,

gssub()機能これはAwkのように動作しますgsub()が、クエリパラメータを正規表現として処理しません(Millerも同様ですgsub())。

必須ではなく、フィールドに引用符を付ける必要があると思われる場合(フィールド値に必要な場合はMillerが自動的に引用符を追加します)、オプションmlrと一緒に使用してください--quote-all

$ mlr --csv -N --quote-all clean-whitespace file
"host1","host1","linux server",""
"host2","host2","linux server",""
$ mlr --csv -N --quote-all put 'for (k,v in $*) { $[k] = gssub(v, "\n", " ") }' file
"host1","host1","linux server",""
"host2","host2","linux server",""

おすすめ記事