2017-03-31 60 views
0

我想打印所選模式中只有具有最小值的行的平方列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

您的要求不明確,部分'只有列數最少的行7,8和9' – Inian

+0

對不起,我只是想讓算術運算的聲音更簡單,因爲精確的數學運算很容易改變。我現在編輯了這個問題。 –

+0

但仍然預期的產出不明確。你如何派生它們?你能解釋一下輸出中的每一行嗎?在什麼基礎上?選擇確切的值和確切的條件 – Inian

回答

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]我們設置/更改最小值,如果它是第一次遇到的關鍵(即比較其餘的初始值)或小於當前最小值。

+0

謝謝,但我需要最小值,在這種情況下,默認值0不能使用,所以我不知道如何修改這個腳本給最小值。 –

+0

現在修好了,先抱歉沒注意。 – karakfa

+0

這一切工作,我只是想了解它。所以v