我正在努力解决以下方面的细微变化: 如何通过取第一个字段进行计算和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