我问了一个类似的问题,很抱歉问这个问题,但我不知道如何解决它。
输入:
+1234.56,a,b,,++,+++++++,+++,+546.76,a,b
期望的输出:
1234.56,a,b,,++,+++++++,+++,546.76,a,b
我希望仅从十进制数字中删除“+”。所以基本上我的要求是将有符号的数字转换为无符号的。
请提前帮助和感谢。
我问了一个类似的问题,很抱歉问这个问题,但我不知道如何解决它。
输入:
+1234.56,a,b,,++,+++++++,+++,+546.76,a,b
期望的输出:
1234.56,a,b,,++,+++++++,+++,546.76,a,b
我希望仅从十进制数字中删除“+”。所以基本上我的要求是将有符号的数字转换为无符号的。
请提前帮助和感谢。
我不完全喜欢这个解决方案......但它可以工作,尽管它在末尾添加了一个逗号:
$ 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,
这个想法是执行 a $field + 0
,这样如果它是数字的,+
就会下降。否则,字符串将保持不变。因此,解决方案遍历所有字段(基于逗号分隔符,FS
)并在完成检查后打印它们。
为了去掉结尾的逗号,Saurabh 建议这样:
awk ... | sed 's/.$//g'
使用gnu awk
,您可以这样做:
awk '{print gensub(/\+([0-9])/,"\\1","g")}' file
1234.56,a,b,,++,+++++++,+++,546.76,a,b
+
当它在任何数字前面时,它会删除[0-9]
这可能对您有用(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 替换。