用尾随 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 的行,第二行删除所有尾随行并递增数字,第三行打印。我假设 9
和 99
是有效的。
这与 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
然后通过使用
中的任何算法获得最大值是微不足道的
我正在尝试查找数字字符串中的最大值,但一些数据包含尾随 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 的行,第二行删除所有尾随行并递增数字,第三行打印。我假设 9
和 99
是有效的。
这与 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
然后通过使用