【问题标题】:SEd: replace whitespace characters with single comma except inside quotesSEd:用单个逗号替换空格字符,引号内除外
【发布时间】:2015-01-21 20:15:27
【问题描述】:

此行来自汽车数据集 (https://archive.ics.uci.edu/ml/datasets/Auto+MPG) 看起来像这样:

15.0   8.   429.0      198.0      4341.      10.0   70.  1.     "ford galaxie 500"

如何用一个逗号替换多个空格(它有空格和制表符),但不在引号内,最好使用 sed,将数据集转换为真正的 csv。谢谢!

【问题讨论】:

  • 也许这会有所帮助:stackoverflow.com/questions/14916159/…
  • 你已经尝试了什么失败了?
  • 我试过了,$ sed 's/[^"] [^"]//g' data/auto-mpg.data-original $ sed 's/[^"][ \t] [^"]/,/g' 数据/auto-mpg.data-original $ sed 's/[^"][ \t]*[^"]/,/g' 数据/auto-mpg.data-original $ sed 's/[^"][ \t][^"]/,/g' 数据/auto-mpg.data-original $ sed 's/[ \t]/,/g;s/,,, //g' data/auto-mpg.data $ sed 's/[ \t]/,/g' data/auto-mpg.data $ perl -pe 's/"(.+?[^\])" /($ret = $1) =~ (s#,##g); $ret/ge' data/auto-mpg.data $ sed 's/(.*"),/\1 /' data/auto-mpg.data $ sed 's/(.*\"),/\1 /g' 数据/auto-mpg.data-commad

标签: regex sed


【解决方案1】:

用 awk 来做:

awk -F'"' 'BEGIN { OFS="\"" } { for(i = 1; i <= NF; i += 2) { gsub(/[ \t]+/, ",", $i); } print }' filename.csv

使用" 作为字段分隔符,每隔一个字段将成为应该替换空格的行的一部分。那么:

BEGIN { OFS = FS }               # output should also be separated by "
{
  for(i = 1; i <= NF; i += 2) {  # in every second field
    gsub(/[ \t]+/, ",", $i)      # replace spaces with commas
  }
  print                          # and print the whole shebang
}

【讨论】:

  • 感谢您的回答,有机会试用后我会通知您。
【解决方案2】:

这可能对你有用(GNU sed):

sed 's/\("[^"]*"\|[0-9.]*\)\s\s*/\1,/g' file

这需要一个带引号的字符串或一个十进制数字后跟空格,并用逗号替换空格 - 贯穿每一行。

为了不那么具体的用途(根据 cmets):

sed -r 's/("[^"]*"|\S+)\s+/\1,/g' file

【讨论】:

  • 这混淆了我的一些测试输入,我一开始得出了错误的结论(对第一条评论感到抱歉)。您的模式中有一个错字:应该转义结束括号,我可以建议用[^[:space:]] 替换[0-9.] 以使其与非数字未引用标记一起使用吗?即:s/\("[^"]*"\|[^[:space:]]*\)\s\s*/\1,/g
  • 感谢您的回答,有机会试用后我会通知您。还要感谢指出使用 sed 而不是 awk 会很愚蠢的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
  • 2019-03-28
  • 2017-05-29
  • 2011-09-30
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多