晚安,
我正在尝试用前导减号替换尾随减号。下面的链接非常有用,但是我很难处理逗号和句号。例如:
输入数据:
|76534| 253,453.86-| 6/4/2012| 56487-56987|
|32567| 36,000.00| 7/8/2012| 45684-4541|
|58531| 400.56-| 10/5/2012| 15232-1254|
|12584| 5.56-| 12/12/2013| 125565-451|
期望的结果(所有其他列保持不变):
-253,453.86
36,000.00
-400.56
-5.56
使用sed -r 's/([[:digit:]]+(\,[[:digit:]]+(\.[[:digit:]]+)?))-/-\1/'
我已经能够用逗号处理数字,但如果可能的话,我想在一个命令中处理所有类型。
答案 0 :(得分:2)
$ awk 'BEGIN{FS=OFS="|"} sub(/-$/,"",$3){sub(/[^ ]/,"-&",$3)}1' file
|76534| -253,453.86| 6/4/2012| 56487-56987|
|32567| 36,000.00| 7/8/2012| 45684-4541|
|58531| -400.56| 10/5/2012| 15232-1254|
|12584| -5.56| 12/12/2013| 125565-451|
答案 1 :(得分:1)
使用[[:digit:],.]
创建一个包含数字,逗号和句点的字符类。其余的你已经知道该怎么做了。
sed -r 's/([[:digit:].,])-/-\1/'
答案 2 :(得分:1)
你可以这样做:
$ sed '/-$/{s/-$//;s/[0-9]/-&/;b};s/^/ /' file
-253,453.86
36,000.00
-400.56
-5.56
更新的答案:
$ awk 'BEGIN{FS=OFS="|"}{for(i=1;i<=NF;i++)if($i~/-$/){sub(/-$/,"",$i);sub(/[0-9]/,"-&",$i)}}1' file
|76534| -253,453.86| 6/4/2012| 56487-56987|
|32567| 36,000.00| 7/8/2012| 45684-4541|
|58531| -400.56| 10/5/2012| 15232-1254|
|12584| -5.56| 12/12/2013| 125565-451|
答案 3 :(得分:1)
这似乎适用于您的多列数据:
sed -r '{s#([0-9][0-9,.]*)-\|#-\1\|#g}'
答案 4 :(得分:1)
另一个通过GNU sed
,
$ sed -r 's/^(\|[0-9]+\|)( *?)([^|]*?)(-)(.*)$/\1\2\4\3\5/g' file
|76534| -253,453.86| 6/4/2012| 56487-56987|
|32567| 36,000.00| 7/8/2012| 45684-4541|
|58531| -400.56| 10/5/2012| 15232-1254|
|12584| -5.56| 12/12/2013| 125565-451|
答案 5 :(得分:1)
一个简单的解决方案:
sed 's/\([^ ]*\)\-|/-\1|/' input