我有一个 data2process.tempdata 文件,其中包含六列数据,如下所示。
# Angle(deg) D1 D2 D3 D4 D5
0.50 0.00E+00 0.00E+00 1.97E-10 3.94E-09 1.97E-10
1.00 0.00E+00 0.00E+00 1.70E-10 3.41E-09 1.70E-10
1.50 0.00E+00 0.00E+00 1.30E-10 2.59E-09 1.30E-10
2.00 0.00E+00 0.00E+00 9.49E-11 1.90E-09 9.49E-11
2.50 0.00E+00 0.00E+00 6.99E-11 1.40E-09 6.99E-11
3.00 0.00E+00 0.00E+00 5.27E-11 1.05E-09 5.27E-11
3.50 0.00E+00 0.00E+00 4.12E-11 8.23E-10 4.12E-11
4.00 0.00E+00 0.00E+00 3.33E-11 6.66E-10 3.33E-11
4.50 0.00E+00 0.00E+00 2.78E-11 5.56E-10 2.78E-11
5.00 0.00E+00 0.00E+00 2.37E-11 4.74E-10 2.37E-11
我想将第六列(D5)与 3.6E8 相乘,并在乘积等于或小于 0.05 时找到第一个实例。此时,我想将相应的值保存在第一列中,打印它并退出。在上面显示的(编辑后的)数据中,第一个实例是在 1.5 度 (1.3e-10*3.6e8=0.0468) 处满足条件时的情况,但此后也成立。所以 echo $ maxangle 应该是 1.5,而不是 5.0,这是也满足条件的最后一个条目。
awk 版本是 GNU Awk 5.0.1,API:2.0(GNU MPFR 4.0.2、GNU MP 6.2.0)
我正在尝试使用以下 awk 命令。
maxangle=$(awk -v maxt=0.05; $6 *=3.6e8 '{if($6<=maxt){maxt=$6; maxa=$1}}END{print maxa ; exit} ' data2process.tempdata)
这给出了一个错误 *=3.6e8: command not found
maxangle=$(awk -v maxt=0.05 v6="$arg6"*3.6e8 '{if($v6<maxt){maxt=$1; maxa=$1}}END{print maxa ; exit} ' data2process.tempdata)
给出v6=*3.6e8 syntax error
maxangle=$(awk -v maxt=0.05 '{$6 = $6 * 3.6e8 ; if($6<=maxt){maxt=$1; maxa=$1}} END{print maxa ;}' data2process.tempdata)
echo $maxangle
给我5.0。
非常感谢您的帮助。我确信我可以使用所有这些。
答案1
如果将 0.05 常量除以 3.6E8,您将得到一个可以直接与字段 6 进行比较的值。这可以避免在比较非常大和非常小的值时出现数字下溢或精度损失的可能性:
awk -v maxt=0.05 '
BEGIN { tdash = maxt / 3.6E8 }
NR>1 && $6 < tdash { print $1; exit }
' data2process.tempdata
答案2
好的,我明白了。
你想要类似的东西
awk -v maxt=0.05 '{t6 = $6 * 3.6e8 ;
if(t6<=maxt){maxt=$1; maxa=$1}}
END{print maxa ;}' data
您必须在 awk 内部才能乘以从文件中获取的值,因此像v6="$arg6"*3.6e8
在 awk 外部的代码一样的东西将不起作用。
给出 0
- (带有缩写数据)第一行满足条件,
maxt
并maxa
设置为 0,条件不再满足。
不需要存储值(除非在 awk 中进行其他计算)
awk -v maxt=0.05 '$6 * 3.6e8 <= maxt {print $1 ; exit ;}' data
在哪里
-v maxt=0.05
赋值给maxt
$6 * 3.6e8 <= maxt
在测试成功条件之前{
(这在 awk 中称为“模式”){print $1 ; exit ;}
打印搜索到的值并退出。 (这在 awk 中称为“动作”)
并用新数据给出 1.5