如何根据特定列的某些特定值应用一些数学运算
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
我想使用 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