在awk中四舍五入,同时保持数字限制在awk中

在awk中四舍五入,同时保持数字限制在awk中,awk,Awk,我有一个包含十进制数的文件,我想在整数部分后保留它们的4位数字: file1.txt 1 A DD CD 1.3028377 CC 3 C JD CJ 0.647670 DD 4 CH FJF RHFH -3.220194 CCD 要将它们四舍五入到4位数: awk '{OFS="\t"}{$4=sprintf("%.4f",$5)}{print $1,$2,$3,$4,$4}' file1.txt 其内容如下: 1 A DD CD 1.3028 1.3028 3 C JD CJ 0.6

我有一个包含十进制数的文件,我想在整数部分后保留它们的4位数字:

 file1.txt

1 A DD CD 1.3028377 CC
3 C JD CJ 0.647670 DD
4 CH FJF RHFH -3.220194 CCD
要将它们四舍五入到4位数:

awk '{OFS="\t"}{$4=sprintf("%.4f",$5)}{print $1,$2,$3,$4,$4}' file1.txt
其内容如下:

1 A DD CD 1.3028 1.3028
3 C JD CJ 0.6476 0.6476
4 CH FJF RHFH -3.2202 -3.2202
这没关系,因为还没有问题的数字

但如果我将其四舍五入到3位小数:

awk '{OFS="\t"}{$4=sprintf("%.3f",$5)}{print $1,$2,$3,$4,$4}' file1.txt



1 A DD CD 1.303 1.303
3 C JD CJ 0.650 0.650
4 CH FJF RHFH -3.22 -3.22
因此,我丢失了最后一行中的第三个小数点,因为它将自身四舍五入为0,并且没有写入

预期产出应为:

1 A DD CD 1.303 1.303
3 C JD CJ 0.650 0.650
4 CH FJF RHFH -3.220 -3.220
1 A DD CD 1.302 1.302
3 C JD CJ 0.647 0.647
4 CH FJF RHFH 3.220 3.220
或者打印时不应进行任何舍入:

1 A DD CD 1.302 1.302
3 C JD CJ 0.647 0.647
4 CH FJF RHFH -3.220 -3.220
如何实现这些输出

编辑:

如下面的答案所示,我可以按如下方式管理预期输出:

awk '{OFS="\t"}{$4=sprintf("%.03f",$5)} 1 ' {print $1,$2,$3,$4,$4}'
但是,如果我想得到这些整数的绝对值,舍入的数字会丢失其整数位数,如下所示:

     awk '{OFS="\t"}{$4=sprintf("%.03f",$5)} 1 ' {print $1,$2,$3,$4,$4}' file1.txt | awk '{OFS="\t"}{$NF=sprintf("%.03f",$NF){$NF=($NF<0)?-$NF:$NF}1' 

1 A DD CD 1.302 1.302
3 C JD CJ 0.647 0.647
4 CH FJF RHFH 3.22 3.22

简单的
awk
s命令同样可以帮助您

解决方案1:因为OP只有更改最后一个字段的输入,所以此解决方案符合以下要求:

awk '{for(i=1;i<=(NF-1);i++){printf("%s ",$i)};printf("%.03f\n",$NF)}'    Input_file
输出如下:

1 A DD CD 1.303
3 C JD CJ 0.648
4 CH FJF RHFH -3.220

在GNUAWK4.1.65上,我得到-3.220。另外,您的表达式表示,
{print$1、$2、$3、$4、$4}
,您将打印
$4
两次。可以吗?可以,我有editedIt是GNU Awk 4.0.2什么是
Awk'BEGIN{printf“%.3f\n”,3.2202}
?你问题中的代码不能产生你所说的来自你发布的输入的输出(您的代码将第一行为
CD
的$4更改为修改后的$5,然后打印$4两次,但输出显示原始$4仍然存在)。您的脚本还将用制表符替换所有空格,但您的输出在字段之间没有制表符。您的问题是显示实际输入数据上运行的实际最小脚本并生成实际输出,以便我们可以帮助您调试您的问题。目前还不清楚您所声称的情况是如何可能发生的。不……这是一个问题nd打印为1.3,即使四舍五入版本为1。300@bapors,请检查我的更新命令,并让我知道。我认为它会工作,但你能检查我的编辑,因为我的数字不在最后一行(NF),它们在第5列,它必须打印数字2times@bapors,现在检查我的解决方案2,并让我知道相同的问题。一个问题是,如果我想得到这些整数的绝对值,当它为0时,我仍然会丢失一个十进制数。我尝试过:˝awk'{OFS=“\t”}{$NF=sprintf(%.03f',$NF)}{$NF=($NF
1 A DD CD 1.303
3 C JD CJ 0.648
4 CH FJF RHFH -3.220