다양한 텍스트가 포함된 대용량 파일이 있습니다. 전체 파일을 반복하고 숫자에 미리 결정된 양(이 경우 EXP="XYZ" 숫자 필드의 2)을 곱하는 스크립트를 사용하고 싶습니다. 그러나 VIEW_RANGE, COOLEYE 및 TAMEBLE이 앞에 오는 경우에만 이 작업을 수행해야 합니다. 전체 문서도 완전히 줄 지어 있습니다.
예
TAMEBLE="0" COOLEYE="20" VIEW_RANGE="9" EXP="12000"
TAMEBLE="0" COOLEYE="5" VIEW_RANGE="12" EXP="1000"
그것은 다음과 같이 보일 것입니다
TAMEBLE="0" COOLEYE="20" VIEW_RANGE="9" EXP="24000"
TAMEBLE="0" COOLEYE="5" VIEW_RANGE="12" EXP="2000"
이 목표를 어떻게 달성할 수 있나요?
답변1
이 테스트 파일을 고려해 보겠습니다.
$ cat file
TAMEBLE="0" COOLEYE="20" VIEW_RANGE="9" EXP="12000" other stuff EXP="2" TAMEBLE="0" COOLEYE="5" VIEW_RANGE="12" EXP="1000"
TAMEBLE, COOLEYE 및 VIEW_RANGE 앞에 EXP 값을 두 배로 늘리려면 다음을 수행하십시오.
$ awk -F'[="]+' '$1=="TAMEBLE" {a[NR]=1} $1=="COOLEYE"{b[NR]=1} $1=="VIEW_RANGE" {c[NR]=1} $1=="EXP" && a[NR-3] && b[NR-2] && c[NR-1] {$0= $1 "=\"" (2*$2) "\""} END{printf"\n"} 1' RS=' ' ORS=' ' file
TAMEBLE="0" COOLEYE="20" VIEW_RANGE="9" EXP="24000" other stuff EXP="2" TAMEBLE="0" COOLEYE="5" VIEW_RANGE="12" EXP="2000"
또는 코드를 여러 줄에 분산시키려는 경우:
awk -F'[="]+' '
$1=="TAMEBLE" {
a[NR]=1
}
$1=="COOLEYE"{
b[NR]=1
}
$1=="VIEW_RANGE" {
c[NR]=1
}
$1=="EXP" && a[NR-3] && b[NR-2] && c[NR-1] {
$0= $1 "=\"" (2*$2) "\""
}
END{printf"\n"}
1
' RS=' ' ORS=' ' file
어떻게 작동하나요?
-F'[="]+'
그러면 필드 구분 기호가
=
또는 조합 으로 설정됩니다"
.$1=="TAMEBLE" {a[NR]=1}
이 레코드의 첫 번째 필드가 TAMEBLE인 경우
a[NR]
true로 설정됩니다. 여기서 은NR
레코드 번호입니다.$1=="COOLEYE"{b[NR]=1}
마찬가지로 레코드의 첫 번째 필드가 COOLEYE이면
b[NR]
true로 설정됩니다.$1=="VIEW_RANGE" {c[NR]=1}
마찬가지로 레코드의 첫 번째 필드가 VIEW_RANGE인 경우
c[NR]`을 true로 설정합니다.
$1=="EXP" && a[NR-3] && b[NR-2] && c[NR-1] {$0= $1 "=\"" (2*$2) "\""}
이 레코드의 첫 번째 필드가 이고
EXP
이전 레코드의 첫 번째 필드가 필수 순서대로 되어 있으면 값을 두 배로 늘립니다EXP
.END{printf"\n"}
파일을 읽은 후 줄바꿈 문자를 인쇄하여 줄을 올바르게 끝내세요.
1
이것은 print-the-line에 대한 awk의 신비한 속기입니다.
RS=' ' ORS=' '
이는 awk에게 공백을 입력 및 출력의 레코드 구분 기호로 처리하도록 지시합니다.