对负小数和正小数进行四舍五入

对负小数和正小数进行四舍五入

我想使用 awk 命令将下面的数字四舍五入为最接近的整数,并将其复制到另一列,例如 col11 和 col12。谁能帮忙

例如1)

column5,column6,,,,,column11,column12,
     -21733.3, -4129.327,,,,,,,

预期产出

 column5,column6,,,,,column11,column12,
-21733.3, -4129.327,,,,,-21733,-4129,
column5,column6,,,,,column11,column12,
      21733.3,4129.327,,,,,,,

预期产出

 column5,column6,,,,,column11,column12,
21733.3,4129.327,,,,,21733,4129,

答案1

如果它是一个简单的 CSV,没有包含换行符或,引号内的字符串字段,那么可以通过以下方式完成awk

awk -F, -v OFS=, '
  NR > 1 {
    $11 = sprintf("%.0f", $5)
    $12 = sprintf("%.0f", $6)
  }
  {print}' < your-file

NR > 1仅将其应用于从第二个开始的记录,而不是标题行)

sprintf("%.0f")四舍五入到最接近的值,int()截断小数部分。

使用mlr,使用列名称并处理更复杂的 CSV(但请注意,CSV 格式有许多变体)

mlr --csv put '$column11 = round(float(strip($column5)));
               $column12 = round(float(strip($column6)))' < your-file

周围有空格的数字被视为细绳by mlr,因此stripping 会产生另一个细绳没有这些空格,然后可以转换为漂浮, 然后漂浮传递到 round().

如果你的数字周围没有空格,这应该足够了:

mlr --csv put '$column11 = round($column5);
               $column12 = round($column6)' < your-file

相关内容