いくつかのレコードのデータが新しい行に移動する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コードの一番上に分岐します。