여러 숫자 필드 스크립트

여러 숫자 필드 스크립트

다양한 텍스트가 포함된 대용량 파일이 있습니다. 전체 파일을 반복하고 숫자에 미리 결정된 양(이 경우 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에게 공백을 입력 및 출력의 레코드 구분 기호로 처리하도록 지시합니다.

관련 정보