如何解决如何根据特定列的某些特定值应用一些数学运算
我想使用 awk 在文本文件 data.dat 中按某种顺序进行一些数学运算。 下面给出了一个示例文件,但是,原始文件具有 m*n 数组,
-0.00309 300.0000 27.48357484
-0.00309 350.0000 27.48339634
-0.00309 400.0000 27.48309821
-0.00309 450.0000 27.48263481
-0.00309 500.0000 27.48196302
-0.00309 550.0000 27.48104749
-0.00309 600.0000 27.47986237
-0.00309 650.0000 27.47839084
-0.00309 700.0000 27.47662366
-0.00309 750.0000 27.47455745
-0.00309 800.0000 27.47219313
0.83311 50.0000 -15.61462258
0.83311 100.0000 -15.61504028
0.83311 150.0000 -15.61524246
0.83311 200.0000 -15.61547435
0.83311 250.0000 -15.61577002
0.83311 300.0000 -15.61597007
0.83311 350.0000 -15.61588681
0.83311 400.0000 -15.61538590
0.83311 450.0000 -15.61439714
0.83311 500.0000 -15.61289898
0.83311 550.0000 -15.61089993
0.83311 600.0000 -15.60842429
0.83311 650.0000 -15.60550308
0.83311 700.0000 -15.60216876
0.83311 750.0000 -15.59845261
0.83311 800.0000 -15.59438360
第一列从负数开始,在几行之后,它改变了它的符号(+ve)。 当第一列具有 -Ve 符号时,我想将第三列(在原始文件中它会有所不同)与 1e-14 相乘,当第一列具有 +Ve 符号时将其与 0.5e-14 相乘。
文件非常大,我无法对其进行手动操作。 我可以使用
在整个文件中应用该操作paste data.dat | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var,$0}' "0.5e-14" | awk '{print $2,$3,$4*$1}'
但这样做我可以一次使用一个操作(对于 -Ve 或 +Ve),这不是我的目标。
我想要一个循环,如果第一列是负数,它应该将第三列与数字 1e-14 相乘,如果第一列是 +Ve,它应该乘以 0.5e-14。
上述文件的预期结果是
-0.00309 300.0000 2.74836e-13
-0.00309 350.0000 2.74834e-13
-0.00309 400.0000 2.74831e-13
-0.00309 450.0000 2.74826e-13
-0.00309 500.0000 2.7482e-13
-0.00309 550.0000 2.7481e-13
-0.00309 600.0000 2.74799e-13
-0.00309 650.0000 2.74784e-13
-0.00309 700.0000 2.74766e-13
-0.00309 750.0000 2.74746e-13
-0.00309 800.0000 2.74722e-13
0.83311 50.0000 -7.80731e-14
0.83311 100.0000 -7.80752e-14
0.83311 150.0000 -7.80762e-14
0.83311 200.0000 -7.80774e-14
0.83311 250.0000 -7.80789e-14
0.83311 300.0000 -7.80799e-14
0.83311 350.0000 -7.80794e-14
0.83311 400.0000 -7.80769e-14
0.83311 450.0000 -7.8072e-14
0.83311 500.0000 -7.80645e-14
0.83311 550.0000 -7.80545e-14
0.83311 600.0000 -7.80421e-14
0.83311 650.0000 -7.80275e-14
0.83311 700.0000 -7.80108e-14
0.83311 750.0000 -7.79923e-14
0.83311 800.0000 -7.79719e-14
该操作将在 gnuplut 脚本中使用。
解决方法
awk
来救援!
$ awk -v n='1e-14' -v p='0.5e-14' '{$3 *= ($1>0?p:n)}1' file
-0.00309 300.0000 2.74836e-13
-0.00309 350.0000 2.74834e-13
-0.00309 400.0000 2.74831e-13
-0.00309 450.0000 2.74826e-13
-0.00309 500.0000 2.7482e-13
-0.00309 550.0000 2.7481e-13
-0.00309 600.0000 2.74799e-13
-0.00309 650.0000 2.74784e-13
-0.00309 700.0000 2.74766e-13
-0.00309 750.0000 2.74746e-13
-0.00309 800.0000 2.74722e-13
0.83311 50.0000 -7.80731e-14
0.83311 100.0000 -7.80752e-14
0.83311 150.0000 -7.80762e-14
0.83311 200.0000 -7.80774e-14
0.83311 250.0000 -7.80789e-14
0.83311 300.0000 -7.80799e-14
0.83311 350.0000 -7.80794e-14
0.83311 400.0000 -7.80769e-14
0.83311 450.0000 -7.8072e-14
0.83311 500.0000 -7.80645e-14
0.83311 550.0000 -7.80545e-14
0.83311 600.0000 -7.80421e-14
0.83311 650.0000 -7.80275e-14
0.83311 700.0000 -7.80108e-14
0.83311 750.0000 -7.79923e-14
0.83311 800.0000 -7.79719e-14
,
为什么要使用awk?对于这些简单的事情,您可以使用 gnuplot 本身。
检查help ternary
。
代码:
### conditional multiplication on columns
reset session
$Data <<EOD
-0.00309 300.0000 27.48357484
-0.00309 350.0000 27.48339634
-0.00309 400.0000 27.48309821
-0.00309 450.0000 27.48263481
-0.00309 500.0000 27.48196302
0.83311 300.0000 -15.61597007
0.83311 350.0000 -15.61588681
0.83311 400.0000 -15.61538590
0.83311 450.0000 -15.61439714
0.83311 500.0000 -15.61289898
EOD
myFactor(col1,col2) = column(col1) > 0 ? column(col2)*0.5e-14 : column(col2)*1e-14
plot $Data u 1:(myFactor(1,3)) w lp pt 7
### end of code
结果:(将绘制的数据)
-0.00309 2.74836e-13
-0.00309 2.74834e-13
-0.00309 2.74831e-13
-0.00309 2.74826e-13
-0.00309 2.7482e-13
0.83311 -7.80731e-14
0.83311 -7.80752e-14
0.83311 -7.80762e-14
0.83311 -7.80774e-14
0.83311 -7.80789e-14
添加:
在您的描述之后,我仍然不能 100% 确定我是否理解您想要的内容。这是一个尝试。实际上这是 gnuplot 的基础知识。
代码:
### create 2 PNG output files
reset session
FILE = 'myData.dat'
set term pngcairo size 600,300
myFactor(col1,col2) = column(col1) > 0 ? column(col2)*0.5e-14 : column(col2)*1e-14
set output 'Column1vs2.png'
plot FILE u 1:(myFactor(1,2)) w lp pt 7 ti "Column3"
set output 'Column1vs2and3.png'
set ytics nomirror
set y2tics nomirror
plot FILE u 1:(myFactor(1,2)) axis x1y1 w lp pt 7 lc "red" ti "Column2",\
'' u 1:(myFactor(1,3)) axis x1y2 w lp pt 7 lc "web-green" ti "Column3"
set output
### end of code
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。