使用尾随9舍入数值

时间:2015-07-16 15:25:38

标签: regex linux bash unix numeric

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

if (DriveApp.getFoldersByName('JobSheet' + year).hasNext() == true) {
    if (DriveApp.getFoldersByName('JobSheet' + months + year).hasNext() == true) {
   var folders = DriveApp.getFoldersByName('JobSheet' + months + year);
   var folder = folders.next();
   var file = DriveApp.getFilesByName(newSpreadsheetName).next();
   folder.addfile(file);

    }
}

我一直在使用以下命令来查找数字的最大值,但是,显然命令会将带有9s的数据视为“max”(例如,6399999 ....)并忽略实际的最大值值。有些数据还包含只有9个数据的错误数据。

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

如何摆脱不良数据(例如,999999)以及如何使用尾随9s(6399999 ...> 64)更正值,以便可以对数据进行舍入(和包含)设置?

5 个答案:

答案 0 :(得分:1)

这与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和。只留下剩余的整数

答案 1 :(得分:1)

To" clean"数据,您可以通过循环遍历所有字段来执行以下操作:

  • 如果只包含9 s,请将其删除。
  • 如果它以多个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

然后使用How to get the biggest number in a file?

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

答案 2 :(得分:0)

根据示例代码构建:

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

这会将每个数字放在自己的行上,然后使用awk修改每一行。 awk检查15 9 s的所有行并将其剥离,然后递增该数字。下一行打印的不是11个9的任何内容。

以上假设1239999999999999999应为1240。相反,它应该是124

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

第一个awk行会跳过仅为9的行,第二行会删除所有尾随行并递增数字,第三行会打印。假设999有效,我会关注3个以上的9个。

答案 3 :(得分:0)

你可以使用这个awk:

awk -v RS=' ' '{gsub(/9+$/, ".&", $1); $1=int($1); print $1; if ($1>max) max=$1}
                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+$/, ".&", $1)将在结束9s之前插入一个小数点。

$1=int($1)将取十进制数的整数值,从而将它们四舍五入。

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

答案 4 :(得分:0)

我假设&#34;空格后跟2位数&#34;是提取所需数字的有效方法:

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