행 식별자 뒤의 열을 변경하려면 gawk를 사용하십시오.

행 식별자 뒤의 열을 변경하려면 gawk를 사용하십시오.

다음 형식의 도면 파일이 여러 개 있습니다. 이 줄 뒤의 파일 영역에서 숫자 값을 늘려야 합니다.. 14.00의 모든 값(아래 예)은 1에서 15.00으로 증가해야 합니다. 이 경우 다음 5줄은15시가 됩니다. $4+1값이 증가하는 것을 볼 수 있지만 소수점 이하 두 자리가 누락되었습니다.

gawk가 C와 유사한 표현을 허용한다는 것을 알 수 있으므로 이것이 해결책이 될 것입니다. 내가 이해하지 못하는 것은 감지하는 방법입니다.필드를 기록하고 조작할 때까지EN도착했다.

이를 달성하는 방법에 대한 제안을 주시면 감사하겠습니다.

감사해요.

AK
  v       0.00u      0.00       0.00       0.00       0.00       0.00       0.00
        398.56       0.00       0.00       0.00       0.00       0.00       0.00
        398.56      50.00       0.00       0.00       0.00       0.00       0.00
          0.00      50.00       0.00       0.00       0.00       0.00       0.00
          0.00       0.00       0.00       0.00       0.00       0.00       0.00
BO
  v      25.00o     18.75      14.00
  v      75.00o     18.75      14.00
  v     323.56o     18.75      14.00
  v     373.56o     18.75      14.00
EN

답변1

이는 매우 간단한 상태 머신을 사용하여 달성할 수 있습니다.

$ awk -v OFS="\t" '/^[A-Z][A-Z]/ && !/^BO/ { flag=0 } /^BO/ { flag=1 } flag == 1 && NF == 4 { $4 = sprintf("%.2f", 1+$4) } { print }' file
AK
  v       0.00u      0.00       0.00       0.00       0.00       0.00       0.00
        398.56       0.00       0.00       0.00       0.00       0.00       0.00
        398.56      50.00       0.00       0.00       0.00       0.00       0.00
          0.00      50.00       0.00       0.00       0.00       0.00       0.00
          0.00       0.00       0.00       0.00       0.00       0.00       0.00
BO
v       25.00o  18.75   15.00
v       75.00o  18.75   15.00
v       323.56o 18.75   15.00
v       373.56o 18.75   15.00
EN

스크립트는 으로 시작하는 줄에 도달할 때까지 입력을 출력으로 파이프한 다음 1로 BO설정하는 것 외에는 아무것도 수행하지 않습니다.flag

1이고 현재 행에 4개의 열이 포함되어 있으면 flag네 번째 열이 사용되고 형식이 다시 지정됩니다. 형식 사양은 "소수점 두 자리의 부동 소수점 값"을 의미합니다.sprintf()1+$4%.2f

BO줄 시작 부분에 다른 내용이 있으면 flag0으로 재설정됩니다.

수정된 출력 행에서 열 사이의 패딩이 변경됩니다. 이는 출력 시 awk필드가 공백으로 분할된 다음 (여기에서는 탭으로 설정됨)을 사용하여 다시 결합되기 때문입니다 .OFS

입력과 정확히 동일한 출력 형식을 얻으려면 다음과 같이 할 수 있습니다.

$ awk -v OFS="\t" '/^[A-Z][A-Z]/ && !/^BO/ { flag=0 } /^BO/ { flag=1 } flag == 1 && NF == 4 { printf("%3s %11s%10.2f %10.2f\n", $1,$2,$3,1+$4); next } { print }' file
AK
  v       0.00u      0.00       0.00       0.00       0.00       0.00       0.00
        398.56       0.00       0.00       0.00       0.00       0.00       0.00
        398.56      50.00       0.00       0.00       0.00       0.00       0.00
          0.00      50.00       0.00       0.00       0.00       0.00       0.00
          0.00       0.00       0.00       0.00       0.00       0.00       0.00
BO
  v      25.00o     18.75      15.00
  v      75.00o     18.75      15.00
  v     323.56o     18.75      15.00
  v     373.56o     18.75      15.00
EN

관련 정보