【问题标题】:linux command to get lines in specified formatlinux命令以指定格式获取行
【发布时间】:2013-10-20 06:34:33
【问题描述】:

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

  1    number     tab    one
  2    number two
  3    number three

现在我想把数据转换成如下形式:

  1    number tab one
  2    number two
  3    number three

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

【问题讨论】:

  • 看起来您正在寻找awk
  • @JimGarrison 我试过 sed 's/^[ \t]*//' 但它似乎没有必要

标签: linux ubuntu sed


【解决方案1】:

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

sed 's/\t/ /2g' file

【讨论】:

    【解决方案2】:

    使用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 循环跳过第一个选项卡并遍历所有字段,但是当函数存在时,为什么让它变得比需要的更复杂呢?只有学校工作才有这种要求。

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

        【解决方案4】:

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

        但你可以这样重新定义问题:

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

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

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

        要在命令行中输入 TAB 字符,您可能需要输入 Ctrl-V TAB

        在较早的 sed 实现中,分号不能用于分隔两个命令,您可以改用 2 个 -e 表达式:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-06
          • 2014-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多