我有一个带有列的文件,如下所示:
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
答案 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
进行文本替换。请注意,您的文件将被此命令更改,因此请先备份!!!