如何在bash和/或使用awk的单列中进行数学运算?

时间:2019-01-03 17:41:03

标签: bash math awk

我有一列这样的几行:

20.000
15.000
42.500
42.500
45.000
45.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000

并且我需要得到一个文件,其中:

第一个元素是20/2

第二个元素是前一个值+ 15/2

第三个元素是先前值+ 42.5 / 2

以此类推,直到最后

我的问题是如何进行“循环”。

5 个答案:

答案 0 :(得分:3)

抢救Perl:

perl -lne 'print $s += $_ / 2' input-file > output-file
  • -l从输入中删除换行符并将其添加到输出中
  • -n逐行读取输入,对每个输入执行代码
  • $_是从每一行读取的值
  • / 2除以2
  • +=是将其乘车手侧添加到其左侧的操作员,并将结果存储在左侧,并返回新值。我将变量$s命名为“ sum”。

答案 1 :(得分:1)

尝试一下:

awk '{prev += ($0) / 2; printf("%.3f\n", prev);}' a2.txt 


输入:

20.000
15.000
42.500
42.500
45.000
45.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000


输出:

10.000
17.500
38.750
60.000
82.500
105.000
130.000
155.000
180.000
205.000
230.000
255.000
280.000
305.000
330.000


答案 2 :(得分:1)

简单

$ awk '{print v+=$1/2}' file

10
17.5
38.75
60
82.5
105
130
155
180
205
230
255
280
305
330

如果需要,您可以设置printf格式

答案 3 :(得分:0)

我想您需要将输出作为一行:

awk '{s+=$1/2; out = out s " ";} END{print out}' file
#=> 10 17.5 38.75 60 82.5 105 130 155 180 205 230 255 280 305 330

我认为最后没有多余的空格。
您可以删除它。

答案 4 :(得分:0)

我认为您可能正在寻找for循环

awk '{for (i = 1; i <= NF; i++) print  temp = temp + $i/2  }' filename

记住一件事, i 指的是列号,如果您只想在一个列中运行此操作,则可以更改

的值

i =列号;我<=列号;

您可以将此循环用于复杂的情况。

如果要更改分隔符,可以使用-F和分隔符之类的参数。

awk -F ":" '{}' filename

enter image description here