2017-03-31 15 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

関連する問題