仅更改文件中的一列中的字符

时间:2014-04-16 00:44:44

标签: awk sed

我有一个看起来像这样的文件

0.9216  .   0
0.6774  .   1
0.7954  .   3
0.6375  .   1
0.6262  .   1

我想替换第二列"。"具有不同的角色," +"。

我可以使用sed执行此操作:

sed 's/[.]/+/g' 

然后"。"在我的第一列也改为加号。我一直在想使用awk可能允许我将这种语法仅应用于一列,但我还没有能够正确理解语法。有什么建议?谢谢!

编辑添加其他数据: 以下两个解决方案都与上面的缩写数据一起使用,但都不适用于扩展数据,如下所示:

dm  G   0.874   1   358 440 12  126890980   .   0
dm  G   0.8253  0.9582  358 440 4   57561647    .   1
dm  A   0.5438  0.9531  358 440 4   85161551    NA  1
dm  T   0.4991  0.8726  358 440 4   108826383   .   1
dm  A   0.7246  0.9817  358 440 4   114553253   .   1
dm  C   0.7691  0.9125  358 440 4   172776204   .   1

为什么会这样?我已尝试为标签指定空格,但它们都是以制表符分隔的。

4 个答案:

答案 0 :(得分:1)

使用sed:在其周围放置空格以将其与小数点分开。

$ sed 's/ [.] / + /' file
0.9216  +   0
0.6774  +   1
0.7954  +   3
0.6375  +   1
0.6262  +   1

使用awk:虽然在修改列时会丢失额外的空格,但awk会重建默认OFS空格的行。

$ awk 'sub(/[.]/," + ",$2)' file
0.9216  +  0
0.6774  +  1
0.7954  +  3
0.6375  +  1
0.6262  +  1

答案 1 :(得分:1)

只需在不同的地方添加空格。

> cat "0.9216  .   0" | sed "s# \. # \+ #"
"0.9216  +   0"

对于扩展数据,您可以使用:

> cat "dm  T   0.4991  0.8726  358 440 4   108826383   .   1" | sed -r "s#(\s+)\.(\s+)#\1\+\2#"
"dm  T   0.4991  0.8726  358 440 4   108826383   +   1"

\s+匹配任何空格字符[\r\n\t\f ] 量词+:在一次和无限次之间,尽可能多次,根据需要回馈。 字面上,\.匹配字符。保留所有匹配的空格,仅用+。

替换点

答案 2 :(得分:1)

您可以使用awk并指定您想要更改的列:

awk '{sub(/\./,"+",$9)}1' file
dm G 0.874 1 358 440 12 126890980 + 0
dm G 0.8253 0.9582 358 440 4 57561647 + 1
dm  A   0.5438  0.9531  358 440 4   85161551    NA  1
dm T 0.4991 0.8726 358 440 4 108826383 + 1
dm A 0.7246 0.9817 358 440 4 114553253 + 1
dm C 0.7691 0.9125 358 440 4 172776204 + 1

答案 3 :(得分:0)

使用awk

awk '{$(NF-1)=$(NF-1)=="\."?"+":$(NF-1)}1' file