对于选定的模式,我想打印只有平方列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
答案 0 :(得分:2)
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<a[$6]
,如果它是第一次遇到密钥(即比较其余的初始值)或小于当前最小值。< / p>