【问题标题】:How to replace dot in linux如何在linux中替换点
【发布时间】:2014-11-29 18:34:35
【问题描述】:

我有一个包含如下所示列的文件:

1000g2012apr_all
  0.07
  0.17
  0.16
  0.23
  0.04
   .
  0.23
  0.15
  0.24

使用解决方案,

  awk 'BEGIN {OFS=FS="\t"} {gsub(/\./,"",$1)}1' 

替换第一列中的所有点。但我只想替换那些没有任何价值的。输出应如下所示 where 。仅在没有值的第 6 行被替换。有人可以帮忙吗?

   1000g2012apr_all
  0.07
  0.17
  0.16
  0.23
  0.04

  0.23
  0.15
  0.24

【问题讨论】:

    标签: awk gsub


    【解决方案1】:

    您想从制表符分隔的文件中删除单独的句点。在这种情况下,您的代码只需要最细微的调整:

    $ awk 'BEGIN {OFS=FS="\t"} {gsub(/^\.$/,"",$1)}1'  file
    1000g2012apr_all
    0.07
    0.17
    0.16
    0.23
    0.04
    
    0.23
    0.15
    0.24
    

    在上面,正则表达式 /\./ 被替换为 /^\.$/ 以确保在句点之前或之后没有任何内容。

    对于这种情况,可以消除使用正则表达式。如果只是测试$1 是否是句号,如果是,则将其删除:

    $ awk 'BEGIN {OFS=FS="\t"} $1 == "." {$1=""}1'  file
    1000g2012apr_all
    0.07
    0.17
    0.16
    0.23
    0.04
    
    0.23
    0.15
    0.24
    

    【讨论】:

      【解决方案2】:

      如果您想保留前导和/或尾随空格,则使用 GNU awk 进行 gensub():

      awk '{$0=gensub(/^([[:space:]]*)\.([[:space:]]*)$/,"\\1\\2","")}1'
      

      如果您不关心保留空白,您可以使用任何 awk 执行此操作:

      awk '{sub(/^[[:space:]]*\.[[:space:]]*$/,"")}1'
      

      【讨论】:

      • 我只想在特定列上使用它,如初始解决方案 ($1) 中所示。
      • 如果您无法调整发布的解决方案以适合您,请更新您的问题以显示一些更具代表性的示例输入和预期输出(例如,多列)。最好是提供测试用例,而不是要求其他人这样做。
      【解决方案3】:

      我没有使用 awk,而是使用了sed。这可能不适合您的用例,但以防万一:

      我将上面的示例文件放在我的 linux 机器上的一个文件中。然后我:

      sed -i 's/\s\+\.\s*$//g' filename 进行文本替换。请注意,此命令将更改您的文件,因此请先备份它!!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-04
        • 2016-06-10
        • 2011-04-07
        • 1970-01-01
        • 2018-09-04
        • 2014-05-24
        • 2015-04-09
        相关资源
        最近更新 更多