入力が次のようになると想像してください。
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
「内部」編集を実行するために使用されます。