我在文件中有一列包含这样的字符串:
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
...
以某种方式忽略乘法。
你能帮忙吗?
答案 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