文件 :
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 hello
andindiana jones
等,不应该受到影响而变成hihello
或 之类的indianajones
。如果可能的话用 awk 解决,否则 sed 也可以。
我无法像这样使用 sed 完成第一个任务:
sed -n 's/,[[:blank:]],/,,/gp' file
但我得到这个作为输出:
january,month is feb , ,,indiana jones
答案1
所以,你在问 awk:
awk '{$1=$1};gsub(" ,",",")'
这行吗?请注意,这会产生删除数据中逗号内重复空格的副作用,这对于英语来说可能不是问题。
答案2
sed 有三种可能性:
g
最简单的一个(在逗号之前匹配空格字符零次或多次,在逗号之后匹配空格字符零次或多次,仅用逗号替换它 - 如此多次,因此使用选项全球的):sed 's/ *, */,/g' file
该命令的执行时间:3.056s,而
perl -p -e
不是sed
5.932s[:space:]
表示所有空白字符,因此与 相同[ \t\r\n\v\f]
。这是 POSIX 标准:sed 's/[[:space:]]*,[[:space:]]*/,/g' file
该命令的执行时间:10.365s,而
perl -p -e
不是sed
9.060s最后是带有 的缩写版本,它的意思与but
\s
相同[:space:]
Perl语法:sed 's/\s*,\s*/,/g' file
该命令的执行时间:10.507s,而
perl -p -e
不是sed
6.126s
所有这些都会导致
hi hello,new york,,,brazil site,brazil
january,month is feb,,,indiana jones
这时间被当作一个有 2M 行的文件(包含 1M 次问题示例文本)。该文件有 97MBytes 大。
第一个命令似乎是最快的sed
。最后一个命令在使用 perl 时是最快的,并且考虑到它不仅替换空格,还替换制表位、换行符等。