用於連接 CSV 中欄位的正規表示式

用於連接 CSV 中欄位的正規表示式

我有一個 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/;/./- 如果我們已經到了這一點(第三個字段是不是空),用點替換分號。

相關內容