Awk 截断列中的小数位

Awk 截断列中的小数位,awk,Awk,如何截断列中的小数位? 我想打印第一列,第二列,小数点将被削减(不是四舍五入)到4位,然后是文本。多谢各位 输入文件 56603.6153 2.212645 56603.6156 2.215645 56603.6158 2.210845 56603.6161 2.216175 56603.6166 2.204975 56603.6168 2.195275 56603.6171 2.219587 56603.6173 2.210778 56603.6

如何截断列中的小数位? 我想打印第一列,第二列,小数点将被削减(不是四舍五入)到4位,然后是文本。多谢各位

输入文件

56603.6153    2.212645
56603.6156    2.215645
56603.6158    2.210845
56603.6161    2.216175
56603.6166    2.204975
56603.6168    2.195275
56603.6171    2.219587
56603.6173    2.210778
56603.6176    2.199887
我试过这个

awk -F. '{print $1"."substr($1,5,4)"   " $2"."substr($2,1,4)}' file
结果是:

56278.8   5545   2.5545 
56278.8   5549   2.5549 
56278.8   5554   2.5554 
56278.8   5559   2.5559   
56278.8   5563   2.5563    
56278.8   5568   2.5568  
我想去

56278.8554   2.5545   
56278.8555   2.5554    
56278.8555   2.5559     
56278.8556   2.5563    
56278.8556   2.5568   

您的预期输出与示例输入不匹配这一事实意味着我们无法充分测试解决方案,但这可能正是您想要的:

$ awk '
    { print t($1), t($2) }
    function t(n,  s) { s=index(n,"."); return (s ? substr(n,1,s+4) : n) }
' file
56603.6153 2.2126
56603.6156 2.2156
56603.6158 2.2108
56603.6161 2.2161
56603.6166 2.2049
56603.6168 2.1952
56603.6171 2.2195
56603.6173 2.2107
56603.6176 2.1998
如果您希望将所有值都设置为该格式,而不是在必要时截断,则将t()返回的值包装到
sprintf(“%.04f”,…)
,即:

function t(n,  s) { s=index(n,"."); return sprintf("%.04f",(s ? substr(n,1,s+4) : n)) }

您的预期输出与示例输入不匹配这一事实意味着我们无法充分测试解决方案,但这可能正是您想要的:

$ awk '
    { print t($1), t($2) }
    function t(n,  s) { s=index(n,"."); return (s ? substr(n,1,s+4) : n) }
' file
56603.6153 2.2126
56603.6156 2.2156
56603.6158 2.2108
56603.6161 2.2161
56603.6166 2.2049
56603.6168 2.1952
56603.6171 2.2195
56603.6173 2.2107
56603.6176 2.1998
如果您希望将所有值都设置为该格式,而不是在必要时截断,则将t()返回的值包装到
sprintf(“%.04f”,…)
,即:

function t(n,  s) { s=index(n,"."); return sprintf("%.04f",(s ? substr(n,1,s+4) : n)) }
此外,始终存在乘法10000提取整数部分除以10000和打印4位小数的方式:

$ awk '{printf "%s %0.4f\n", $1, int($2*10000)/10000}' file
56603.6153 2.2126
56603.6156 2.2156
56603.6158 2.2108
56603.6161 2.2161
56603.6166 2.2049
56603.6168 2.1952
56603.6171 2.2195
56603.6173 2.2107
56603.6176 2.1998
只是不要使用它。

此外,总是有乘以10000提取整数部分除以10000和打印4位小数的方式:

$ awk '{printf "%s %0.4f\n", $1, int($2*10000)/10000}' file
56603.6153 2.2126
56603.6156 2.2156
56603.6158 2.2108
56603.6161 2.2161
56603.6166 2.2049
56603.6168 2.1952
56603.6171 2.2195
56603.6173 2.2107
56603.6176 2.1998


请不要用它。

对不起,我编辑了它。是MWC吗?我有我发送的数字文件,我向终端linux写入了我之前发送的内容。预期的输出是什么?输出数字与输入数字根本不匹配。是否存在一些未指定的转换,或者您只是使用了不相关的输入和输出数据?示例输入的预期输出应该是示例中的输出。因为某些小数位数的值可能不精确。对不起,我编辑了它。是MWC吗?我有我发送的数字文件,我向终端linux写入了我之前发送的内容。预期的输出是什么?输出数字与输入数字根本不匹配。是否存在一些未指定的转换,或者您只是使用了不相关的输入和输出数据?示例输入的预期输出应该是示例中的输出。由于某些小数位数的值不精确,您确定这不会由于$2*10000和int()中的浮点运算而引入错误吗将结果向零截断,然后除以10000生成另一个浮点,然后sprintf()向偶数截断(或者不管平台实现了什么方向?我会小心的…这里已经过了午夜,你有没有想到一个具体的例子?我已经关闭了我的左脑…这可能不会,但我肯定我会梦到一些恶魔般的东西,会在凌晨3点叫醒我。是的,这正是我刚刚发现的一个问题m如果它可能发生(但我刚才也说服自己不要认为它可能真的发生,这表明了我所知道的!)。这是X*10000上的FP算法得出的近似值比X小0.001,但边际减少使它在前5位中小1,然后是int()四舍五入接近零。如果有帮助的话,下面是我要留下的评论:我已经仔细考虑过这个问题,我认为唯一可能出现问题的方法是,如果有一些2美元的值,当乘以10000时,最后5位数字的数字比开始时的数字低,例如,如果3.0000001*10000不知何故变成了29999.99浮点运算的结果是9999或类似的。然后int()将向零取整,接着就出现了欢闹。我不认为会发生这种情况,但idk,FP运算的复杂性并不是我真正关心的!嗯,你确定不会因为$2*10000和int()中的浮点运算而引入错误吗将结果向零截断,然后除以10000生成另一个浮点,然后sprintf()向偶数截断(或者不管平台实现了什么方向?我会小心的…这里已经过了午夜,你有没有想到一个具体的例子?我已经关闭了我的左脑…这可能不会,但我肯定我会梦到一些恶魔般的东西,会在凌晨3点叫醒我。是的,这正是我刚刚发现的一个问题m如果它可能发生(但我刚才也说服自己不要认为它可能真的发生,这表明了我所知道的!)。这是X*10000上的FP算法得出的近似值比X小0.001,但边际减少使它在前5位中小1,然后是int()四舍五入接近零。如果有帮助的话,下面是我要留下的评论:我已经仔细考虑过这个问题,我认为唯一可能出现问题的方法是,如果有一些2美元的值,当乘以10000时,最后5位数字的数字比开始时的数字低,例如,如果3.0000001*10000不知何故变成了29999.99浮点运算的结果是9999或类似的。然后int()将向零取整,接着会出现欢闹。我不认为会发生这种情况,但idk,FP运算的复杂性并不是我真正关心的!非常感谢,我能请你解释一下这部分吗?{s=index(n,“.”;return(s?substr(n,1,s+4):n)}.什么是(n,“.”意思?不客气。你有没有试着在awk手册中查找这些内容?试着用谷歌搜索
awk index
,然后点击第一个结果。非常感谢,我能请你解释一下这部分吗?{s=index(n,“.”;返回(s?substr(n,1,s+4):n)}。什么是(n,“.”是什么意思?不客气。你有没有试着在awk手册中查找这些内容?试着用谷歌搜索
awk索引
,然后点击第一个结果。