ファイルのために悩んでいます。通常、ホストごとに1行を定義する必要があります。しかし、時々、誰かがいくつかのフィールドを別の行に分割することがあります。例は次のとおりです。
"host1","host1","linux
server",""
"host2","host2","linux server",""
今、私はこの問題を解決する方法(bashでより良い方法)を見つけたいと思います。
"host1","host1","linux server",""
"host2","host2","linux server",""
各フィールドは二重引用符で囲む必要があります。そうでない場合は、\n
aが挿入されてからそれを削除して、行ごとに常に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",""