Perl/awk/bash: 원시 텍스트 대신 인라인으로 값을 곱하고 합산함 [닫기]

Perl/awk/bash: 원시 텍스트 대신 인라인으로 값을 곱하고 합산함 [닫기]

다음과 같은 텍스트가 있습니다.

;---------------------------------------
JOURNEY_ARRAY_01
    .BYTE <JOURNEY_00
    .BYTE <JOURNEY_01
;---------------------------------------
JOURNEY_ARRAY_03
    .BYTE JOURNEY_01-JOURNEY_00
    .BYTE JOURNEY_02-JOURNEY_01
;---------------------------------------
JOURNEY_00                              ; From 00 to 01
    .BYTE $01, $01, $01, $03, $01, $01, $03, $01
    .BYTE $03, $01, $03, $01, $03, $01, $03, $01
    .BYTE $03, $03, $01, $03, $03, $03, $03, $00
    .BYTE $03, $03, $00, $03, $00, $03, $00, $03
    .BYTE $00, $03, $00, $03, $03, $00, $03, $03
    .BYTE $00, $03, $03, $03, $03, $03, $03, $01
    .BYTE $03, $03, $01, $03, $03, $01, $03
;---------------------------------------
JOURNEY_01                              ; From 00 to 04
    .BYTE $01, $01, $01, $03, $01, $01, $03, $01
    .BYTE $03, $01, $03, $01, $03, $01, $03, $01
    .BYTE $03, $03, $01, $03, $01, $03, $01, $01
    .BYTE $03, $01, $03, $01, $01, $01, $01, $01
    .BYTE $02, $01, $01, $01, $02, $01, $01, $01
    .BYTE $02, $01, $01, $01, $01, $01, $01, $01
    .BYTE $01, $01, $01
;---------------------------------------

".BYTE" 뒤에 있는 모든 숫자 값을 가져와서 4개 값마다 다음을 수행해야 합니다. - 첫 번째 값에는 아무 작업도 수행하지 않습니다. - 두 번째 값에 *4를 곱합니다. - 네 번째 값에 *16을 곱합니다. 값에 *64를 곱합니다. 4개의 값이 함께 추가되고 결과는 4개의 원래 값 대신 "$"가 앞에 붙는 16진수 형식으로 표시됩니다. ".BYTE" 뒤의 값이 4의 배수가 아니거나 4보다 작은 경우 누락된 값은 0으로 계산되어야 합니다. 예를 들어:

.BYTE $01, $01, $01, $03, $01, $01, $03, $01

다음과 같아야 합니다:

.BYTE $57, 5D

왜냐하면:

03*1 = 3 +
01*4 = 4 +
01*16 = 16 +
01*64 = 64 = 87 = $57
and
01*1 = 1 +
03*4 = 12 +
01*16 = 16 +
01*64 = 64 = 93 = $5D

나타나지 않는 값은 수학에서 0으로 평가해야 하는데...물론 다른 텍스트는 변경하면 안 됩니다.

누구나?

답변1

다음 sed플러스 gawk(GNU awk) 솔루션은 요청된 작업을 수행합니다.

 sed -e '/ .BYTE/{s/\$/0x/g;s/,//g}' INPUTFILE.txt | 
     gawk --non-decimal-data '/.BYTE.*0x/{ printf ".BYTE $%x, $%x\n",
       ($5+$4*4+$3*16+$2*64 ) , ($9+$8*4+$7*16+$6*64) };!/.BYTE.*0x/{print}'

이 호출은 쉼표를 sed대체 하고 수정이 필요한 줄에서 쉼표를 제거합니다 . 그런 다음 awk 호출은 16진수를 식별하고 계산을 수행하며 해당 행에 결과를 인쇄합니다. 다른 줄은 단순히 출력에 복사됩니다.$010x01.BYTE

.BYTE패턴은 주어진 예에서 작동하지만 다른 라인 형식을 사용하는 경우 수정이 필요할 수 있습니다.

이 명령은 한 줄에 숫자 4개의 블록이 정확히 두 개 있다고 가정합니다. 따라서 입력의 마지막 줄을 출력합니다.

.BYTE $54, $0

관련 정보