-1

我在 csv 中有以下形式的数据:

  1    number     tab    one
  2    number two
  3    number three

现在我想将数据转换为以下形式:

  1    number tab one
  2    number two
  3    number three

即我希望第一个选项卡保持原样..但是第二个和连续的选项卡将被空格替换。是否可以使用 linux 命令(如 sed 等)来执行此操作。我知道我可以使用 sed 进行替换,但是否可以让它跳过第一个制表符空间并从第二个制表符空间开始替换。

4

4 回答 4

3

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

sed 's/\t/ /2g' file
于 2013-10-20T08:25:01.083 回答
1

使用awk,您可以这样做。

cat file
1       number  tab     one
2       number two
3       number three

awk

awk '{$1=$1;sub(/ /,"\t")}1'
1       number tab one
2       number two
3       number three

$1=$1将所有空格设置为默认一个空格。

sub(/ /,"\t")将第一个空格更改为制表符

1打印一切

PS您可以使用for循环跳过第一个选项卡并遍历所有字段,但是当函数存在时,为什么让它变得更复杂呢?只有学校工作有这种要求。

于 2013-10-20T08:08:28.633 回答
1

跳过第一个标签并不容易。

但是你可以用这种方式重新定义问题:

  1. 用空格替换所有制表符
  2. 用制表符替换第一个空格

这可能有点有损,但实际上可以忽略不计,结果是一样的:

sed -e 's/    / /g; s/ /      /' < yourfile.txt

要在命令行上输入 TAB 字符,您可能必须键入Ctrl-V TAB.

sed在分号无法分隔两个命令的旧实现中,您可以改用 2 个-e表达式:

sed -e 's/    / /g' -e 's/ /      /' < yourfile.txt
于 2013-10-20T08:16:13.317 回答
1
cat file
1   number     tab    one
2   number two
3   number three

尝试这个:

sed 's/\s\+/ /2g' file
1   number tab one
2   number two
3   number three
于 2013-10-20T09:13:16.823 回答