截断列中的小数位

时间:2018-12-14 06:23:33

标签: 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.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   

2 个答案:

答案 0 :(得分:2)

您的预期输出与样本输入不匹配的事实意味着我们无法充分测试解决方案,但这也许就是您想要的:

$ 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

如果您关心使所有值格式化而不是在必要时仅截断,请在sprintf("%.04f",...)中将t()的返回值括起来,即:

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

答案 1 :(得分:1)

此外,总会有乘以10000的整数部分除以10000并打印4的小数的方式:

< s>
$ 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

只是不要使用它。