Arquivo revbytes2.awk
:
#!/usr/bin/awk -f
BEGIN {
FS=",? +"
}
NF>2 && match($0,"^ +\.BYTE ") {
printf substr($0,1,RSTART+RLENGTH-1)
for(i=NF;i>3;i--) printf $i", "
print $3
next
}
1
FS=",? +"
faz com que awk
reconheça o espaço depois de .BYTE
e a sequência de espaço ,
plus entre os bytes como separador de campo.
Para cada linha, procuraremos linhas com mais de dois campos, começando com espaços seguidos por .BYTE
e um espaço e rember o início e a duração desse prefixo em RSTART
e RLENGTH
como efeito colateral do% expressãomatch(...)
.
Se essa correspondência for encontrada e houver mais de dois campos, o prefixo será cortado da linha original usando RSTART
e RLENGTH
e será impresso, seguido dos demais campos na ordem inversa.
Se os espaços mais .BYTE
mais prefixo de espaço não forem encontrados ou se não houver mais de dois campos, a linha será impressa como está. Então, isso será feito para uma .BYTE
-line definindo apenas um byte também, porque não há nada para reverter.
Execução de teste:
$ diff -u$(wc -l <input) input <(awk -f revbytes2.awk input)
--- input 2014-10-19 06:04:48.280714146 +0200
+++ /dev/fd/63 2014-10-19 22:40:01.385538235 +0200
@@ -1,42 +1,42 @@
ITINERARY_ARRAY_01
.BYTE <ITINERARY_00A
.BYTE <ITINERARY_01A
.BYTE <ITINERARY_02A
.BYTE <ITINERARY_03A
.BYTE <ITINERARY_04A
.BYTE <ITINERARY_05A
.BYTE <ITINERARY_06A
.BYTE <ITINERARY_07A
.BYTE <ITINERARY_08A
.BYTE <ITINERARY_09A
.BYTE <ITINERARY_10A
.BYTE <ITINERARY_11A
.BYTE <ITINERARY_12A
.BYTE <ITINERARY_13A
.BYTE <ITINERARY_14A
;-------------------
ITINERARY_01E
- .BYTE $03, $05, $07, $00
+ .BYTE $00, $07, $05, $03
;-------------------
ITINERARY_01F
- .BYTE $03, $05, $07, $09, $00
+ .BYTE $00, $09, $07, $05, $03
;-------------------
ITINERARY_01G
- .BYTE $28, $0D, $00
+ .BYTE $00, $0D, $28
;-------------------
ITINERARY_01H
- .BYTE $28, $0D, $0F, $13, $00
+ .BYTE $00, $13, $0F, $0D, $28
;-------------------
ITINERARY_01I
- .BYTE $28, $0D, $0F, $11, $00
+ .BYTE $00, $11, $0F, $0D, $28
;-------------------
ITINERARY_01J
- .BYTE $03, $05, $07, $09, $20, $1E, $00
+ .BYTE $00, $1E, $20, $09, $07, $05, $03
;-------------------
ITINERARY_01K
- .BYTE $28, $0D, $0F, $13, $15, $00
+ .BYTE $00, $15, $13, $0F, $0D, $28
;-------------------
ITINERARY_01L
- .BYTE $03, $05, $07, $09, $20, $1E, $1C, $27
+ .BYTE $27, $1C, $1E, $20, $09, $07, $05, $03
.BYTE $00
;---------------------
Comparando mawk
e gawk
output:
$ diff <(mawk -f revbytes2.awk input) <(gawk -f revbytes2.awk input)
gawk: revbytes2.awk:5: warning: escape sequence '\.' treated as plain '.'
Obviamente não há diferenças no stdout. Bom!
O aviso desaparece se você escrever "^ +6BYTE "
em vez de "^ +\.BYTE "
dentro da expressão match(...)
.
Talvez alguém que use gawk
conheça com frequência uma maneira melhor de evitar o aviso.