使用UNIX格式化

时间:2013-10-11 09:45:42

标签: shell unix sed string-formatting

我问了一个类似的问题,很遗憾地问这个,但我没有得到解决方法。

输入:

+1234.56,a,b,,++,+++++++,+++,+546.76,a,b

期望的输出:

1234.56,a,b,,++,+++++++,+++,546.76,a,b

我希望仅从十进制数中删除'+'。所以基本上我的要求是将有符号数转换为无符号数。

请提前帮助和谢谢。

3 个答案:

答案 0 :(得分:1)

我完全不喜欢这个解决方案...但是它虽然在最后添加了一个尾随逗号,但它仍然有效:

$ awk 'BEGIN{FS=","} {for (i=1; i<=NF; i++) {if ($i+0==$i) {$i=$i+0}; printf "%s,", $i}}' a
1234.56,a,b,,++,+++++++,+++,546.76,a,b,

解释

我们的想法是执行$field + 0,这样如果它是数字,则+会下降。否则,字符串将保持不变。因此,解决方案遍历所有字段(基于逗号分隔符,FS)并在执行该检查后打印它们。


为了摆脱尾随的逗号,Saurabh建议这样:

awk ... | sed 's/.$//g' 

答案 1 :(得分:1)

使用gnu awk,您可以执行此操作:

awk '{print gensub(/\+([0-9])/,"\\1","g")}' file
1234.56,a,b,,++,+++++++,+++,546.76,a,b

+位于任意数字[0-9]

之前时,它会将其删除

答案 2 :(得分:0)

这可能适合你(GNU sed):

 sed -r 's/(^|,)\+([0-9]+\.[0-9]+)/\1\2/g' file

或(紧要关头):

 sed -r 's/(^|,)\+([0-9])/\1\2/g' file

捕获反向引用1中的文件或逗号的开头,然后是+符号,然后捕获一个数字后跟一个.,后跟一个数字进入后引用2.替换为反向引用1和2.