レコードデータを新しい行に移動

レコードデータを新しい行に移動

いくつかのレコードのデータが新しい行に移動するCSVファイルがあります。

例:

  ABCD,1234,QWER
  ASDF
  ,2345,VGFT
  "ASDF,12",1212,ASDR 
  1234,ZXCV,ERTT

出力は次のようになります。

  ABCD,1234,QWER
  ASDF,2345,VGFT
 "ASDF,12",1212,ASDR 
  1234,ZXCV,ERTT

2番目と3番目の列を組み合わせる方法はありますか?

答え1

以下は、与えられたデータに対して機能する素朴なハッキングです。

$ awk -F, 'NF != 3 { printf("%s",$0); getline } 1' file.csv
ABCD,1234,QWER
ASDF,2345,VGFT
1234,ZXCV,ERTT

これは、awkファイルをコンマ区切りのデータセットに解析することです。行に正確に 3 つのフィールド ( ) がない場合、NF != 3これまでに読み込んだ行のビットが後行改行なしのまま出力され、次の行が読み込まれます。 Final1はの略語{ print }で、すべての行を印刷します。

最初のブロックがトリガされた場合、最後の1/は、print出力の終わりに残りの中断が出力されるようにしますprintf

そのバリエーションは次のとおりですsed

$ sed -E '/^[^,]+,[^,]+,[^,]+$/!{ N; s/\n//; }' file.csv
ABCD,1234,QWER
ASDF,2345,VGFT
1234,ZXCV,ERTT

同様に、サンプルデータに示されているものとは異なる方法で行が変わると、この機能は機能しない可能性があります。

このsedスクリプトが行うことは、正規表現を使用して各行をテストすることです^[^,]+,[^,]+,[^,]+$。一致する場合、コンマで区切られたコンマ以外の文字で構成される3つのフィールドがあるように見える行があります。もしそうならいいえこの場合、次の行は現在の行の末尾に追加され、2行の間に挿入された改行文字はN削除されます。sed

コードsedはコードと同じロジックに従いますawk。現在の行にエラーがある場合は、次のデータ行を追加します。

答え2

有名なラインsedのバリエーション:

$ sed -e :a -e '$!N;s/\n[[:blank:]]*,/,/;ta' -e 'P;D' file.csv
  ABCD,1234,QWER
  ASDF,2345,VGFT
  "ASDF,12",1212,ASDR 
  1234,ZXCV,ERTT

答え3

sed次のようにシェル変数を混在させることで、GNUでこれを行うことができます。

nF='[^,]*';        # a normal unquoted csv field
qF='"[^"]*"';      # a quoted csv field
F="\($qF\|$nF\)";  # a csv field
ok="$F,$F,$F\$";   # a csv record with exactly 3 fields
# ok="\($F,\)\{2\}$F\$"; # an equivalent way to write out the regex for an ok csv record

sed -e "
    :a;/$ok/b       
    N;s/\n//;ba
" input.csv

出力

ABCD,1234,QWER
ASDF,2345,VGFT
"ASDF,12",1212,ASDR 
1234,ZXCV,ERTT

〜のように

  • sedで使用するシェル変数の混合を使用してcsvを作成するための構文。
  • csvレコードには3つ以下のフィールドがあるとします。
  • まず、csvレコードが正常かどうか、つまり3つのフィールドがあることを確認してください。その場合は、そのレコードを印刷し、次のレコードを読みます。
  • OTW、つまり現在のcsvレコードに3つ未満のフィールドが見つかりました。コマンドを使用して次の行をN追加し、コネクタaを削除し、\nこの修正されたパターンスペースを使用してsedコードの一番上に分岐します。

関連情報