在 bash 中计算数字并将其四舍五入

在 bash 中计算数字并将其四舍五入

我正在努力解决以下方面的细微变化: 如何通过取第一个字段进行计算shell中如何对浮点数进行四舍五入?

我有一个看起来像(列之间的空格)的文件:

1533 C_P.doc
691 C_M.doc
905 G_S.doc
945 J_Z.doc
1549 J_M.doc
1701 L_B.doc

我想获取数字列并将每个数字除以 65(但向上舍入),然后添加包含这些数字的新列(最好是在左侧)。 IE

24 1533 C_P.doc
11 691 C_M.doc
14 905 G_S.doc
15 945 J_Z.doc
24 1549 J_M.doc
27 1701 L_B.doc

我想在 bash 脚本中做到这一点。是否可以?如有必要,可以移除中间的柱子(如果这样更容易的话)。

[乌班图14.04]

答案1

通过awk并保持中间柱:

awk '{printf("%.f ", ($1/65)+0.5)}1' infile > outfile
24 1533 C_P.doc
11 691 C_M.doc
14 905 G_S.doc
15 945 J_Z.doc
24 1549 J_M.doc
27 1701 L_B.doc

通过awk和不通过中柱:

awk '{printf("%.f", ($1/65)+0.5); $1=""}1' infile > outfile
24 C_P.doc
11 C_M.doc
14 G_S.doc
15 J_Z.doc
24 J_M.doc
27 L_B.doc

请注意,+0.5被用作ceil()函数的替代,并且它向上舍入到下一个数字。最后1激活默认打印。

答案2

您可以使用perl

$ perl -MPOSIX=ceil -anle '$F[0] = ceil($F[0]/65);print "@F"' file
24 C_P.doc
11 C_M.doc
14 G_S.doc
15 J_Z.doc
24 J_M.doc
27 L_B.doc

答案3

如果您不介意python在 shell 中使用并假设这a.txt是您的文件:

[sreeraj@server ~]$ cat a.txt
1533 C_P.doc
691 C_M.doc
905 G_S.doc
945 J_Z.doc
1549 J_M.doc
1701 L_B.doc
[sreeraj@server ~]$ for i in $(awk -v c=65 '{ print $1/c }' a.txt) ; do python -c 'print int(round('$i',0))' ; done >> b.txt
[sreeraj@server ~]$ paste b.txt a.txt > c.txt
[sreeraj@server ~]$ cat c.txt
24      1533 C_P.doc
11      691 C_M.doc
14      905 G_S.doc
15      945 J_Z.doc
24      1549 J_M.doc
26      1701 L_B.doc
[sreeraj@server ~]$

这将创建具有所需输出的文件 c.txt。

怎么运行的:

它用于awk将 a.txt 第一列中的值除以 65,然后使用 的python内置函数round()对小数点进行四舍五入。然后我们使用“for”循环的输出创建一个文件 c.txt 并用于paste组合 c.txt 和 a.txt

相关内容