【问题标题】:awk shrinks multiple spaces to one [duplicate]awk 将多个空格缩小为一个 [重复]
【发布时间】:2020-06-15 23:03:49
【问题描述】:

我正在尝试使用 awk 删除第一列。如果我将空字符串分配给第一列,那么另一列中的所有其他空格都会缩小到一个空格。如何禁用空间收缩?

$ echo 'a   b   c' | awk '{print $0}'
a   b   c

$ echo 'a   b   c' | awk '{$1=""; print $0}'
 b c

我在 ubuntu repo 中使用标准 awk

$ dpkg -l | grep awk
ii  mawk                                  1.3.3-17ubuntu3                                  amd64    a pattern scanning and text processing language

【问题讨论】:

  • 当您修改awk 中的任何列时,即$1="",您会强制awk 使用默认的OFS 重新格式化记录,这只是一个空格。

标签: awk


【解决方案1】:

当您修改awk 中的任何字段时,即$1=""强制 awk 使用默认的OFS 重新格式化记录,这只是一个空格。

话虽如此,awk 中删除第一列同时保留字段之间的空格的一种方法是:

echo 'a   b   c' | awk '{sub(/^[[:blank:]]*[^[:blank:]]+[[:blank:]]+/, "")} 1'

b   c

或者,如果您使用的是 gnu-awk,请使用:

echo 'a   b   c' | awk -v RS='[[:blank:]]+' 'NR > 1{ORS=RT; print}'

b   c

【讨论】:

    【解决方案2】:

    使用数组的另一种方式slice

    echo 'a   b   c' | perl -lane 'print join "\t", @F[1..2]'
    

     输出

    b   c
    

    【讨论】:

      【解决方案3】:
      echo 'a   b   c' | awk '{print substr($0,index($0,FS)+1)}'
      

      【讨论】:

      • 如果您解释了您提供的代码如何回答问题,这将是一个更好的答案。
      【解决方案4】:

      sed 可能更容易

      $ echo 'a   b   c' | sed -E 's/\S+\s+//'
      b   c
      

      【讨论】:

        猜你喜欢
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        • 2014-06-03
        • 1970-01-01
        • 2015-01-06
        相关资源
        最近更新 更多