从unix中的管道分隔文件中删除尾随零

时间:2014-09-23 22:11:23

标签: unix

我有一个pipedelimited文件,有几个带小数的字段,我需要在任何字段中的小数点后忽略零并将输出重定向到另一个文件,可能有几个十进制列,如列A,如下所示

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

任何人都可以请求帮助找到解决方案,它应检查任何小数字段并从这些字段中删除尾随零,输出应重定向到不同的文件

如果以上情况不可行 那么我正在寻找至少在下面的解决方案

因为我知道十进制字段的位置,是否有任何方法可以在unix命令中指定这些特定字段并从这些字段中删除尾随零并将输出重定向到新文件,如果有人能找到,我将不胜感激这个解决方案

2 个答案:

答案 0 :(得分:2)

您可以使用awk执行此任务:

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

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

答案 1 :(得分: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之类的内容就可以了。