用尾随 9 舍入数值

Rounding numerical values with trailing 9s

我正在尝试查找数字字符串中的最大值,但一些数据包含尾随 9。

999999999999 63 66 69 71 73 75 76 78 80 81 81 80 79 74 67 63999999999999999

我一直在使用以下命令来查找数字的最大值,但显然该命令将尾随 9 的数据视为 "max"(例如 6399999....)和忽略实际的最大值。一些数据还包含只是一堆 9 的错误数据。

grep -Eo '[0-9]+' file_temp | sort -rn | head -n 1 > file_temp_max

如何删除错误数据(例如 999999)以及如何更正尾随 9 的值(6399999... > 64),以便它们可以四舍五入(并包含在)中数据集?

根据您的示例代码构建:

grep -Eo '[0-9]+' file_temp | awk '
   ~ /999999999999999/ { sub(/999999999999999$/,""); ++}
  [=10=] != 999999999999'

这会将每个数字放在自己的行中,然后使用 awk 修改每一行。 awk 检查任何包含 15 9 的行并将它们剥离,然后递增数字。下一行打印任何不是十一个九的东西。

上面假设1239999999999999999应该是1240。相反,它应该是 124:

grep -Eo '[0-9]+' file_temp | awk '
   ~ /^999+$/ { next }
   ~ /999$/ { sub(/9+$/,""); ++}
  { print }'

第一行 awk 跳过刚好是 9 的行,第二行删除所有尾随行并递增数字,第三行打印。我假设 999 是有效的。

这与 Adams 的回答略有不同,在循环中使用 sed。

首先,我假设您不知道将包括多少个 9。其次,我正在使用中间转换来浮动。

for line in $(cat file_temp); do 
    i=$(echo $line |  sed 's/../.&/;t;s/^.$/.0&/');
    printf "%.02f\n" $i;
done | sed 's/\.//;s/^0//' | sort -nr

细分:

sed 's/../.&/;t;s/^.$/.0&/'第二个字符后加小数点

printf "%.02f\n" $i; 将值打印为浮点数 - 自动为您四舍五入。

sed 's/\.//;s/^0//' 去除前导 0 和 .只留下剩余的整数

你可以使用这个 awk:

awk -v RS=' ' '{gsub(/9+$/, ".&", ); =int(); print ; if (>max) max=}
                END{print "max = ", max}' file
0
63
66
6
71
73
75
76
78
80
81
81
80
7
74
67
64
max =  81

gsub(/9+$/, ".&", )会在9结束前插入一个小数点。

=int() 将从小数中取整数值,从而将它们四舍五入。

if (>max) max=是简单的max计算。

我假设 "a space followed by 2 digits" 是提取所需数字的有效方法:

echo 999999999999 63 66 69 71 73 75 76 78 80 81 81 80 79 74 67 63999999999999999 | 
grep -o ' [0-9][0-9]' | 
sort -n | 
tail -1

生产

 81

对于"clean"数据,可以通过循环遍历所有字段来进行如下操作:

  • 如果它仅包含 9 秒,请将其删除。
  • 如果它以多个 9 结束,请删除它们并将剩余的数字递增一个。

根据您给定的输入查看它的实际效果:

$ awk '{for(i=1;i<=NF;i++) {if ($i~/^9+$/) $i=""; if (sub(/9+$/,"",$i)) $i++}}1' a 
 63 66 7 71 73 75 76 78 80 81 81 80 8 74 67 64

然后通过使用

中的任何算法获得最大值是微不足道的