我有一个看起来像这样的文件
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
为什么会这样?我已尝试为标签指定空格,但它们都是以制表符分隔的。
答案 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