2つの行を1つにマージする方法

2つの行を1つにマージする方法

私は以下の記録を持っています

"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には簡潔なコマンド構文があります。これは何のためであるか。

  1. :aラベル作成のために、
  2. このNコマンドは次の行を追加します。
  3. 私たちのタグに分岐してください$!ba
  4. s間のテキストを置き換えます。/\n(...)/
  5. 最初の新しい行は\n角かっこの外にあるので削除されます。
  6. /\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;Dpragmaはeofまでこのプロセスを繰り返します。
  • コマンドを使用してcsvファイルの2行をパターンスペースとして確認します$!N

awk入力ラインに基づいて出力レコード区切り文字を操作し、所望の出力を得ることができる。

$ awk '{ORS = /"$/ ? RS : ""}1' file.csv

関連情報