从字符串进行awk算术运算

时间:2019-04-24 16:42:15

标签: awk operation

我在文件中有一列包含这样的字符串:

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
...

以某种方式忽略乘法。

你能帮忙吗?

6 个答案:

答案 0 :(得分:2)

这是评估字符串的通用方法,它可以处理*+-/等。如果可以使用perl然后可以选择eval字符串,这将从输入中评估用于数学运算的字符串。

案例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

案例2::仅评估一列时:在这种情况下为第六列。提供要评估的列号,F [5]是第六列。

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

情况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

答案 1 :(得分:2)

请您尝试以下操作(仅在看到提供的示例后经过测试和编写)。

awk '{split($NF,array,"*");printf("%.01f\n",array[1]*array[2])}' Input_file

答案 2 :(得分:2)

sprintf本身无法评估操作。您需要对其进行分析和评估,然后可以使用sprintf将结果转换为具有特定格式的字符串。

$ awk -v OFS='  ' 'split($NF,a,/\*/)>1{$NF=a[1]*a[2]} 1' file
[[  ]]  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

答案 3 :(得分:2)

Awk无法对变量中的表达式求值,您需要为其构建一个求值器或对其他方式求值,例如:

$ awk '{
    cmd="awk \47BEGIN{print " $6 "}\47"  # prepare an external awk command 
    cmd | getline retval                 # execute
    print retval                         # output evaluated value
    close(cmd)                           
}' file

输出:

1126.4
1024
1126.4
1126.4

有一些可以评估的awk程序,例如calc3。 Google是您的朋友,我的朋友。

答案 4 :(得分:2)

这是您要做什么吗?

$ awk -F'[[:space:]*]+' '{printf "%.1f\n", $(NF-1) * $NF}' file
1126.4
1024.0
1126.4
1126.4

答案 5 :(得分:0)

如果d文件中的数据,请在gnu awk上尝试:

 awk -F'\\*' '{a=$1*$2; printf "%-6.1f\n",a}' d