SEd:用单逗号替换空白字符,引号内除外

SEd: replace whitespace characters with single comma except inside quotes

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

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

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

用 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
}

这可能适合您 (GNU sed):

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

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

不太具体的用途(根据评论):

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