awk は、他のパターンマッチングに基づいてパターンマッチング後に次の行を変更します。

awk は、他のパターンマッチングに基づいてパターンマッチング後に次の行を変更します。

次の行を含むファイルがあります。

....
pattern1 100 200 300
pattern2 300 400 400
pattern1 300 900 700
pattern1 200 500 900
...

上記の例に示すように、下にはいくつかの行がありますが、すべてではありませんpattern2pattern1一致し、pattern1次の行にoneがあることを確認しpattern2、そうであれば定数要素を掛けて次の数値フィールドを変更します。 withを試しましたが、getline結果の出力からawkwith行が削除されました。pattern1

awk '/pattern1/{getline; if($1==pattern2) $(NF-2)*=0.889848406214}1' infile.dat

入力ファイルで他の変更を行わずにこれを行うことができる方法に関する提案があります。

答え1

awk '
  /pattern1/ { f = 1; print; next }
  f && /pattern2/ { $(NF-2) *= 0.889848406214 }
  { f = 0; print }
' <file

答え2

次の行にすぐに移動するため、アプローチが失敗するため、getline現在の行が失われます。簡単な解決策は現在の行を変数に保存し、それから次に進む:

$ awk '{
        if(/pattern1/){
            l=$0; 
            getline; 
            if($1=="pattern2"){
                $(NF-2)*=0.889848406214
            } 
            print l"\n"$0
        }
        else{print}
       }' file
pattern1 100 200 300
pattern2 266.955 400 400
pattern1 300 900 700
pattern1 200 500 900

または、フラグを使用して前の行が一致するかどうかを追跡しますpattern1

$ awk '{if(/pattern2/ && l){$(NF-2)*=0.889848406214} /pattern1/ ? l=1 : l=0;}1;' file
pattern1 100 200 300
pattern2 266.955 400 400
pattern1 300 900 700
pattern1 200 500 900

関連情報