awk 根据另一个模式匹配更改模式匹配后的下一行

awk 根据另一个模式匹配更改模式匹配后的下一行

我有一个文件,其中包含以下行:

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

如上例所示,下面有一些行,pattern2pattern1不是全部。我想匹配pattern1然后检查下一行是否有pattern2,如果有,则通过将其乘以常数因子来更改下一个数字字段。我尝试使用getlinewith但它从结果输出中awk删除了 with 行: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

相关内容