二重引用符フィールド内で改行で区切られた行をマージする方法は?

二重引用符フィールド内で改行で区切られた行をマージする方法は?

入力が次のようになると想像してください。

KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8
",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

3行が必要です(たとえば、改行は####です)。

KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8####",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

ありがとう、エマニュエル

答え1

awk解決策:

awk -F',' '{ printf "%s%s", $0, ($NF ~ /^".+[^"]$/? "####" : ORS) }' file

出力:

KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8####",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

答え2

sed -r ':x /$/ { N; s/\r?\n\s*"/####"/; bx}' inputfile

\r?LinuxおよびWindowsのテキストファイルで動作するように設定

答え3

データは適切に引用されており、CSVをサポートするすべてのパーサーで読み取ることができなければなりません。

ヘッダーなしのCSVファイルの5番目のフィールドから可能な改行を削除するには、次のようにします。ミラー( mlr) このように:

$ mlr --csv -N put '$5 = sub($5,"\n","")' file
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,1GH8,KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

これにより、最初の改行文字をに置き換えて5番目のフィールドを再作成しますsub()(つまり削除します)。

####改行文字を次に置き換えることもできます。

$ mlr --csv -N put '$5 = sub($5,"\n","####")' file
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,1GH8####,KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

結果フィールドには引用符が必要ないため、Miller はデフォルトで引用符を追加しません。元の引用符を保持するには、次のようにします--quote-original

$ mlr --csv -N --quote-original put '$5 = sub($5,"\n","####")' file
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8####",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

-I「内部」編集を実行するために使用されます。

関連情報