awk는 다른 패턴 일치를 기반으로 패턴 일치 후 다음 줄을 변경합니다.

awk는 다른 패턴 일치를 기반으로 패턴 일치 후 다음 줄을 변경합니다.

다음 줄이 포함된 파일이 있습니다.

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

위의 예에 표시된 것처럼 아래에는 일부 행이 있지만 전부는 아닙니다 pattern2. pattern1일치시키고 pattern1다음 행에 one 이 있는지 확인하고 pattern2, 그렇다면 상수 요소를 곱하여 다음 숫자 필드를 변경합니다. with를 사용해 보았지만 getline결과 출력에서 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

관련 정보