![CSV 内のフィールドを結合する正規表現](https://rvso.com/image/1317163/CSV%20%E5%86%85%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE.png)
次の形式の 200 万件を超えるレコードを含む CSV があります。
path;name;extension;size;date;user
/foo/;difacs;cgi;3,795;18-07-2011;Unix User\pads
/foo/;difacs.cgi;bak;2,622;03-12-2009;Unix User\pads
/foo/test/kzt/netcdfSample/testing/;zzz;;401;27-07-2006;Unix User\kzt
/foo/test/kzt/netcdfSample/vic_netcdf_popup/;a;txt;1,832;17-02-2006;Unix User\kzt
パス、名前、拡張子を 1 つの正しくフォーマットされたフィールドに結合する必要があります。
path;size;date;user
/foo/difacs.cgi;3,795;18-07-2011;Unix User\pads
/foo/difacs.cgi;bak;2,622;03-12-2009;Unix User\pads
/foo/test/kzt/netcdfSample/testing/zzz/;401;27-07-2006;Unix User\kzt
/foo/test/kzt/netcdfSample/vic_netcdf_popup/a.txt;1,832;17-02-2006;Unix User\kzt
前もって感謝します!
答え1
これは、空の拡張フィールドを適切に処理する slhck の回答のバリエーションです (また、2 番目または 3 番目のフィールドに意図的に存在していた可能性のあるドットを誤って置き換えることを回避します)。
sed 's/^\([^;]*\);\([^;]*\)/\1\2/;ta;:a;s/^[^;]\+;;/&/;t;s/;/./' inputfile
3 番目のキャプチャ グループを使用する必要はありません。その答えは、それなしでも機能します。代替コマンドの右側のドットをエスケープする必要はありません。
私のスクリプトの説明は次のとおりです。
- 区切るセミコロンを除いた最初の 2 つのフィールドをキャプチャします。
ta;:a
- 置換が成功した場合は、:a
直後のラベルに分岐します - これにより、「成功」フラグがクリアされますs/^[^;]\+;;/&/
- セミコロン以外のシーケンスの後に 2 つのセミコロンが続くシーケンス (連結された最初のフィールドと 2 番目のフィールドの後に空の 3 番目のフィールドが続くシーケンス) をそれ自体に置き換えます。これは何も実行しませんが、「成功」フラグを設定します。t
- 最後の置換が成功した場合(3番目のフィールドが空の場合)、現在の行の処理の最後までスキップします(ラベルが指定されていないため)s/;/./
- ここまで来たら(3番目のフィールドはない空の場合は、セミコロンをドットに置き換えます。