2014-09-23 148 views
0

我有一个pipedelimited文件,有几个小数字段,我需要在任何字段中的小数点后忽略零,并将输出重定向到一个不同的文件,像列A列小数所见下面从unix中的管道分隔文件中删除尾随零

column A 
24.4400 
.8930 
1.6730 
.2200 
1.6870 

预期输出

24.44 
0.893 
1.673 
0.22 
1.687 

下面假设是管道分隔的文件

080|580||185.50|12|0|24.4400|2014-06-09|20140531 
080|580||185.20|12|0|700.00|2014-06-09|20140531 
080|580||185.30|12|0|30.500|2014-06-09|20140531 

预期输出应该

080|580||185.5|12|0|24.44|2014-06-09|20140531 
080|580||185.2|12|0|700|2014-06-09|20140531 
080|580||185.3|12|0|30.5|2014-06-09|20140531 

任何人都可以请找到一个解决方案helpme,则应检查任何小数领域和移除这些领域和输出尾随零应该被重定向到一个不同的文件

如果以上是不可能的 那么我ATLEAST寻找一个解决方案在下面

,因为我知道这个位置o f十进制字段,有没有什么办法可以在unix命令中指定这些特定字段,并从这些字段中删除尾随零并将输出重定向到一个新文件,我将不胜感激任何人都可以找到这种解决方案

+0

我想不出为什么你需要这样做。你能解释一下,还是这是一个学习练习?祝你好运。 – shellter 2014-09-23 22:16:23

+0

你可以使用python吗?更直接。 – beroe 2014-09-23 23:34:46

回答

2

您可以使用AWK此任务:

$ awk -F\| '{$4=sprintf("%g",$4);$7=sprintf("%g",$7)}1' OFS="|" file 

sprintf("%g",$7):打印最短表示或浮动。

+0

你可以直接说'{$ 4 = $ 4 + 0; $ J = $ 7 + 0} 1'。它会自动转换为数字,以便尾随零将离开。 – fedorqui 2014-09-24 08:27:42

+0

我只是注意到,删除拖尾零在这里是没用的,只需要掩码就可以了,我也喜欢你的解决方案@fedorqui – klashxx 2014-09-24 08:33:08

1

这个awk怎么样?

$ awk 'BEGIN{FS=OFS="|"} {$4=$4+0; $7=$7+0}1' file 
080|580||185.5|12|0|24.44|2014-06-09|20140531 
080|580||185.2|12|0|700|2014-06-09|20140531 
080|580||185.3|12|0|30.5|2014-06-09|20140531 

这是第4和第7场转换成数字,使得后端0消失的惯用方式。

注意关键是要在现场进行算术运算。因为我们希望价值保持原样,所以可以使用+0,/0(如果没有0)或*1

+0

+1,但我会用'$ 4 + = 0; $ 7 + = 0';) – klashxx 2014-09-24 08:42:06

+0

更喜欢'$ 4 = $ 4 + 0'来保持它更清晰。但我喜欢你的想法,谢谢@ klashxx! – fedorqui 2014-09-24 09:48:13