다음 형식의 도면 파일이 여러 개 있습니다. 이 줄 뒤의 파일 영역에서 숫자 값을 늘려야 합니다.악. 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
줄 시작 부분에 다른 내용이 있으면 flag
0으로 재설정됩니다.
수정된 출력 행에서 열 사이의 패딩이 변경됩니다. 이는 출력 시 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