Linux

通過刪除空格來改變模式?

  • March 1, 2013

文件 :

hi hello,new york,      ,  ,brazil site   ,brazil
january,month is feb   ,      , ,indiana jones

任務:

  • 如果除空格外沒有其他字元,則刪除任意兩個逗號(如 , ,)之間的所有水平空格(空格和製表符)。所以它看起來像:
hi hello,new york,,,brazil site   ,brazil
january,month is feb   ,,,indiana jones
  • 此外,刪除每個參數的任何尾隨或前導水平空格(空格和製表符),使其看起來像這樣。

最終輸出:

hi hello,new york,,,brazil site,brazil
january,month is feb,,,indiana jones

注意:參數本身有空格等hi helloindiana jones它不應該受到影響,變成像hihelloor indianajones。如果可能的話,用 awk 解決,否則 sed 也可以。

我無法像這樣使用 sed 完成第一項任務:

sed -n 's/,[[:blank:]],/,,/gp' file

但我得到這個作為輸出:

january,month is feb   ,      ,,indiana jones

sed 有三種可能性:

  1. 最簡單的一個(在逗號之前匹配空格字元零次或多次,在逗號之後匹配空格字元零次或多次,僅用逗號替換它 - 並且多次,因此使用gglobal選項):
sed 's/ *, */,/g' file

此命令的時間: 3.056s,perl -p -e而不是sed5.932s 2. [:space:]表示所有空白字元,因此與[ \t\r\n\v\f]. 這是 POSIX 標準

sed 's/[[:space:]]*,[[:space:]]*/,/g' file

此命令的時間: 10.365s,perl -p -e而不是sed9.060s 3. 最後是帶有 的縮寫版本\s,它代表與 Perl 語法相同[:space:]但為Perl 的語法

sed 's/\s*,\s*/,/g' file

此命令的時間: 10.507s,perl -p -e而不是sed6.126s

所有這些都導致

hi hello,new york,,,brazil site,brazil
january,month is feb,,,indiana jones

一個 2M 行的文件所花費的時間(包含問題範例文本 1M 次)。該文件有 97MBytes 大。

第一個命令似乎是最快的sed。最後一個命令在使用 perl 時是最快的,並且考慮到它不僅替換了空格,還替換了製表符、換行符等。

所以,你在問 awk:

awk '{$1=$1};gsub(" ,",",")'

這會嗎?請注意,這具有刪除逗號內數據中重複空格的副作用,這對於英語可能不是問題。

引用自:https://unix.stackexchange.com/questions/66271