【问题标题】:refering to a line containing a column-wise calculated value引用包含按列计算的值的行
【发布时间】:2017-04-01 02:49:15
【问题描述】:

对于选定的模式,我只想打印具有最小值的行 7,8 和 9 的平方和的总和(如下面的脚本,我以 $ script.sh patterns.txt 运行)。我的脚本打印特定模式的最后一行,我只想打印包含最小值的行。我怎么能引用那条线?

下面是输入和期望的输出。

while IFS='' read -r line || [[ -n "$line" ]]; do
grep -E -wr $line input.txt| awk '{ min=($7^2)+($8^2)+($9^2);} FNR==NR  {if (($7^2)+($8^2)+($9^2)<=min) min=($7^2)+($8^2)+($9^2);} END {print $0}' >> output.txt
done < "$1"

输入

-3.79 43 18.6279 16.5936 -1.33 CAN  1 10 100  
-3.79 43 18.6279 16.5937 -1.33 CAN  2 20 200  
10.51 -66 1.71937 -9.93556 1.20 CAS 5 50 500  
10.51 -66 1.71937 -9.93556 1.21 CAS 4 40 400  
10.51 -66 1.71937 -9.93555 1.20 CAS 6 60 600  
-9.41 38 17.751 16.7401 -0.25 CASC  12 20 400  
-9.41 38 17.751 16.7401 -0.53 CASC  13 50 500  
-9.41 38 17.751 16.7401 -0.25 CASC  12 20 400 

输出

-3.79 43 18.6279 16.5936 -1.33 CAN  1 10 100  
10.51 -66 1.71937 -9.93556 1.21 CAS 4 40 400  
-9.41 38 17.751 16.7401 -0.25 CASC  12 20 400

【问题讨论】:

  • 你的要求不清楚,部分only the rows with minimum sum of columns 7,8 and 9
  • 对不起,我只是想让算术运算听起来更简单,因为精确的数学运算很容易改变。我现在编辑了问题。
  • 但仍不清楚预期的输出。你是如何推导出它们的?你能解释一下输出中的每一行吗?在什么基础上?选择准确的值和准确的条件
  • 我按照上面的脚本导出它,min=($7^2)+($8^2)+($9^2)。仅选择具有相同列 $5 的行,因为这是 grep 的模式,例如为所有包含 CAN 的行计算最小值并给出第一行输出。
  • 既然您使用的是awk,请使用 awk 读取数据并执行正则表达式。更简单

标签: bash awk


【解决方案1】:

awk 来救援!

awk                     '{v=$7^2 + $8^2 + $9^2} 
  !($6 in a) ||  v<a[$6] {a[$6]=v; line[$6]=$0} 
  END                    {for(k in line) print line[k]}' file


-3.79 43 18.6279 16.5936 -1.33 CAN  1 10 100
10.51 -66 1.71937 -9.93556 1.21 CAS 4 40 400
-9.41 38 17.751 16.7401 -0.25 CASC  12 20 400

为了找到你需要设置初始值的最小值,这里我们检查之前是否遇到过这个键。

这是!($6 in a) || v&lt;a[$6] 的关键条件@ 如果它是第一次遇到的键(即用于比较其余部分的初始值)或小于当前最小值,我们设置/更改最小值。

【讨论】:

  • 谢谢,但我需要最小值,在这种情况下不能使用默认值 0,所以我不知道如何修改此脚本以给出最小值。
  • 现已修复,抱歉一开始没注意。
  • 一切正常,我只是想了解一下。所以 v
猜你喜欢
  • 1970-01-01
  • 2020-06-01
  • 2023-03-18
  • 1970-01-01
  • 2014-04-30
  • 2014-01-24
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
相关资源
最近更新 更多