![用於連接 CSV 中欄位的正規表示式](https://rvso.com/image/1317163/%E7%94%A8%E6%96%BC%E9%80%A3%E6%8E%A5%20CSV%20%E4%B8%AD%E6%AC%84%E4%BD%8D%E7%9A%84%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F.png)
我有一個 CSV,其中包含超過 200 萬筆記錄,格式如下。
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
我需要將路徑、名稱和副檔名加入到一個格式正確的欄位中。
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 答案的變體,它正確處理空擴展字段(並避免錯誤地替換有意存在於第二個或第三個字段中的點):
sed 's/^\([^;]*\);\([^;]*\)/\1\2/;ta;:a;s/^[^;]\+;;/&/;t;s/;/./' inputfile
沒有必要使用第三個捕獲組。這個答案沒有它就有效。沒有必要轉義替代命令右側的點。
這是我的腳本的解釋:
- 捕獲前兩個字段,不包括分隔它們的分號。
ta;:a
- 如果成功替換,則分支到:a
緊接著的標籤 - 這有效地清除了「成功」標誌s/^[^;]\+;;/&/
- 將一系列非分號後跟兩個分號(連接的第一個和第二個字段,後面跟著一個空的第三個字段)替換為自身- 這是一個無操作,但它設置了“成功”標誌。t
- 如果最後一次替換成功(第三個欄位為空),則跳到目前行的處理結束(因為沒有指定標籤)s/;/./
- 如果我們已經到了這一點(第三個字段是不是空),用點替換分號。