如何根据特定列的某些特定值应用一些数学运算

How to apply some mathematical operation depending upon some particular values of particular column

我想使用 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, [=11=]}' "0.5e-14" | awk '{print , , *}'

但这样做我一次可以使用一个操作(对于-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?对于这种简单的事情,您可以使用 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

结果:

awk 救援!

$ awk -v n='1e-14' -v p='0.5e-14' '{ *= (>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