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

use*_*041 2 sed awk cut head

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

例如1)

column5,column6,,,,,column11,column12,
     -21733.3, -4129.327,,,,,,,
Run Code Online (Sandbox Code Playgroud)

预期产出

 column5,column6,,,,,column11,column12,
-21733.3, -4129.327,,,,,-21733,-4129,
Run Code Online (Sandbox Code Playgroud)
column5,column6,,,,,column11,column12,
      21733.3,4129.327,,,,,,,
Run Code Online (Sandbox Code Playgroud)

预期产出

 column5,column6,,,,,column11,column12,
21733.3,4129.327,,,,,21733,4129,
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

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

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

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

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

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

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

周围有空格的数字被视为字符串mlr,因此stripping 会生成另一个没有这些空格的字符串,然后可以将其转换为float,并将该float传递给 round()

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

mlr --csv put '$column11 = round($column5);
               $column12 = round($column6)' < your-file
Run Code Online (Sandbox Code Playgroud)

  • 在许多(但不是全部)系统上, `sprintf("%.0f")` 将 `.5` 舍入为最接近的 **偶数** 数字,因此 `1.5` 将舍入为 `2`,但 `2.5` 也会舍入为“2” - 值得一提的是,如果有人认为“.5”总是向上或向下舍入,或者“2.5”在所有系统上都会舍入为“3”(或“2”)。请参阅 https://www.gnu.org/software/gawk/manual/gawk.html#Round-Function。 (2认同)