首页 > 解决方案 > 来自字符串的 awk 算术运算

问题描述

我在一个文件中有一个特定的列,其中包含这样的字符串:

1.1*1024
1.0*1024
1.1*1024
...

我想要数字结果:

1126.4
1024.0
1126.4

所以我尝试了这个,请注意尺寸在我文件的第 6 列:

$ cat file | awk '{col=$6;size=sprintf("%f", col);print "=> col = "col" size = "size}'
=> col = 1.1*1024 size = 1.100000
=> col = 1.0*1024 size = 1.000000
=> col = 1.1*1024 size = 1.100000

EDIT1 我的输入文件如下所示:

$ cat file 
[[  ]]  toto1.mp4  2019-04-16  22:11  1.1*1024
[[  ]]  toto2.mp4  2019-04-16  21:41  1.0*1024
[[  ]]  toto3.mp4  2019-04-16  22:40  1.1*1024
[[  ]]  toto4.mp4  2019-04-16  22:09  1.1*1024
...

不知何故,乘法被忽略了。

你能帮我吗 ?

标签: awkoperation

解决方案


这是评估字符串的通用方法,它可以处理*, +,-/。如果您可以使用perl,则字符串有选项eval,这将从输入中评估字符串以进行数学运算。

CASE-1:评估整行时:

cat inputfile
1+1
2*2
3/3
4.5*2
5/2

perl -nle ' print eval ' inputfile
2
4
1
9
2.5

CASE-2:仅评估一列时:在这种情况下是第 6 列。提供要评估的列号,F[5] 是第 6 列。

perl -nale  'print  eval  $F[5]' inputfile
1126.4
1024
1126.4
1126.4

case-3:评估第 6 列时,但打印整个记录。评估第 6 列并更新其值,然后打印整行。

perl -nale  '$F[5] = eval  $F[5] ;print "@F"' inputfile
[[ ]] toto1.mp4 2019-04-16 22:11 1126.4
[[ ]] toto2.mp4 2019-04-16 21:41 1024
[[ ]] toto3.mp4 2019-04-16 22:40 1126.4
[[ ]] toto4.mp4 2019-04-16 22:09 1126.4

推荐阅读