![Perl/awk/bash: 生テキストの代わりにインラインで値を掛けて合計する [閉じる]](https://linux33.com/image/57894/Perl%2Fawk%2Fbash%3A%20%E7%94%9F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%A7%E5%80%A4%E3%82%92%E6%8E%9B%E3%81%91%E3%81%A6%E5%90%88%E8%A8%88%E3%81%99%E3%82%8B%20%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
次のテキストがあります。
;---------------------------------------
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進数を識別し、計算を実行し、その行に結果を印刷します。他の行は単に出力にコピーされます。$01
0x01
.BYTE
.BYTE
パターンは与えられた例で動作しますが、他の行形式を使用する場合は修正が必要になる場合があります。
このコマンドは、1行に4つの数字のブロックが正確に2つあると仮定します。したがって、入力の最後の行を出力します。
.BYTE $54, $0