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つの値ごとに次のことを行う必要があります。 - 最初の値には何もしません。 - 2番目の値に* 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

表示されない値は数学でゼロと評価する必要があります...もちろん、他のテキストは変更しないでください。

誰でも?

ベストアンサー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パターンは与えられた例で動作しますが、他の行形式を使用する場合は修正が必要になる場合があります。

このコマンドは、1行に4つの数字のブロックが正確に2つあると仮定します。したがって、入力の最後の行を出力します。

.BYTE $54, $0

おすすめ記事