如何在linux中替换dot

时间:2014-11-29 18:34:36

标签: awk gsub

我有一个带有列的文件,如下所示:

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' 

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

   1000g2012apr_all
  0.07
  0.17
  0.16
  0.23
  0.04

  0.23
  0.15
  0.24

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果要保留前导和/或尾随空格,请使用GNU awk for gensub():

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

如果你不关心保留空白,你可以用任何awk来做这件事:

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

答案 2 :(得分:0)

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

我把你的示例文件放在我的linux盒子里的文件中。然后我:

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