私は以下の記録を持っています
"1234", "abcg"
"456899","jklm
sd"
"34566","lmno"
同じ行の2番目のレコードを続けたいので、出力は次のようになります。
"1234", "abcg"
"456899","jklmsd"
"34566","lmno"
ポイントは、2行に分けるのではなく2行目を続けたいということです
答え1
この試み、
awk '/^"/{printf "\n";} {printf "%s",$0}' test.csv
"1234", "abcg"
"456899","jklmsd"
"34566","lmno"
/^"/{printf "\n";}
行が二重引用符で始まると、新しい行が追加されます。{printf "%s",$0}
各行の新しい行が削除されます。
答え2
このawk
方法は単純さのためにうまく機能します。ただし、sed
提案されているように、ストリームエディタを使用して複数行にわたって作業することも可能です。この回答。この技術は他の状況でも役立ちます。
sed -r ':a;N;$!ba;s/\n([^, "]+\"\n)/\1/g' file
Sedには簡潔なコマンド構文があります。これは何のためであるか。
:a
ラベル作成のために、- この
N
コマンドは次の行を追加します。 - 私たちのタグに分岐してください
$!ba
。 s
間のテキストを置き換えます。/\n(...)/
- 最初の新しい行は
\n
角かっこの外にあるので削除されます。 /\1/
かっこ内の内容を再度入れてください。
パターン[^, "]
regex
は、不完全なフィールドを見つけるための迅速な推測です。引用符で終わるカンマや空白のない行を見つけ、前の行に追加します。ファイルには、このような単純なパターンでは解決できない他の矛盾がある可能性があります。
結果:
"1234", "abcg"
"456899","jklmsd"
"34566","lmno"
答え3
csvjson
次のコードはfromを使用して、CSVデータの2番目の列に含まれるすべての改行を削除します。csvkitデータをJSONに変換し、jq
すべての改行を見つけて置き換えて、データ型をCSVに戻します。
$ csvjson -H file.csv | jq -r '.[] | .b |= gsub("\n"; "") | [ .a, .b ] | @csv'
1234," ""abcg"""
456899,"jklmsd"
34566,"lmno"
奇妙に見えるのは、" ""abcg"""
元のデータに二重引用符が含まれているためです(フィールドの最初の二重引用符の前のスペースのため、フィールドを引用するのではなくデータに含まれます)。
オプションは、最初の行がヘッダー行ではなくデータであることをツールに-H
伝えます。csvjson
このjq
式は、各行の2つのフィールドの合計を使用します.a
。.b
答え4
次の行のレコードを含むCSVを変更するには、sed
エディタを使用できます。
$ sed -e '
$!N
/\n"/!s/\n//
P;D
' file.csv
説明する:
- 二重引用符で始まらない行はオーバーフローするため、前の行とマージされるように改行を削除します。
P;D
pragmaはeofまでこのプロセスを繰り返します。- コマンドを使用してcsvファイルの2行をパターンスペースとして確認します
$!N
。
awk
入力ラインに基づいて出力レコード区切り文字を操作し、所望の出力を得ることができる。
$ awk '{ORS = /"$/ ? RS : ""}1' file.csv