【问题标题】:remove trailing zeros from a pipe delimited file in unix从 unix 中的管道分隔文件中删除尾随零
【发布时间】:2014-09-24 16:53:52
【问题描述】:

我有一个用竖线分隔的文件,带有小数的字段很少,我需要忽略任何字段中小数点后的零并将输出重定向到不同的文件,可能像下面所示的 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 命令中指定这些特定字段并从这些字段中删除尾随零并将输出重定向到新文件,如果有人能找到我将不胜感激解决方案

【问题讨论】:

  • 我想不出你为什么需要这样做。你能解释一下,还是这是一个学习练习?祝你好运。
  • 你能用python吗?更直接。

标签: unix


【解决方案1】:

你可以使用 awk 来完成这个任务:

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

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

【讨论】:

  • 你可以直接说{$4=$4+0; $7=$7+0}1。它会自动转换为数字,所以后面的零会留下。
  • 我只是注意到在这里删除尾随零是没有用的,可以只用掩码来完成,我也喜欢你的解决方案@fedorqui
【解决方案2】:

这个 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 之类的东西。

【讨论】:

  • 我更喜欢$4=$4+0 以保持更清晰。但我喜欢你的想法,谢谢@klashxx!
猜你喜欢
  • 2012-07-01
  • 2012-07-02
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 2020-01-25
  • 2013-07-20
相关资源
最近更新 更多