Digamos que eu gerei dois hexdump, que incluem o asterisco. Primeiro arquivo ( xxd -r
funciona):
hexdump random.dat
0000000 6161 6161 6161 6161 6161 6161 6161 6161
*
0000020 6161 6261 6262 6262 6262 6262 6262 6262
0000030 6262 6262 6262 6262 6262 6262 6262 6262
*
00000b0
Segundo arquivo ( xxd -r
não funciona):
hexdump data2.dat
0000000 6161 6161 6161 6161 6161 6161 6161 6161
*
0000020 6161 6261 6262 6262 6262 6262 6262 6262
0000030 6262 6262 6262 6262 6262 6262 6262 6262
*
00000b0 000a
00000b1
Gostaria de poder gerar o dump original sem apertar e sem ter o arquivo original. Exatamente assim:
hexdump -v random.dat
0000000 6161 6161 6161 6161 6161 6161 6161 6161
0000010 6161 6161 6161 6161 6161 6161 6161 6161
0000020 6161 6261 6262 6262 6262 6262 6262 6262
0000030 6262 6262 6262 6262 6262 6262 6262 6262
0000040 6262 6262 6262 6262 6262 6262 6262 6262
0000050 6262 6262 6262 6262 6262 6262 6262 6262
0000060 6262 6262 6262 6262 6262 6262 6262 6262
0000070 6262 6262 6262 6262 6262 6262 6262 6262
0000080 6262 6262 6262 6262 6262 6262 6262 6262
0000090 6262 6262 6262 6262 6262 6262 6262 6262
00000a0 6262 6262 6262 6262 6262 6262 6262 6262
00000b0
hexdump -v data2.dat
0000000 6161 6161 6161 6161 6161 6161 6161 6161
0000010 6161 6161 6161 6161 6161 6161 6161 6161
0000020 6161 6261 6262 6262 6262 6262 6262 6262
0000030 6262 6262 6262 6262 6262 6262 6262 6262
0000040 6262 6262 6262 6262 6262 6262 6262 6262
0000050 6262 6262 6262 6262 6262 6262 6262 6262
0000060 6262 6262 6262 6262 6262 6262 6262 6262
0000070 6262 6262 6262 6262 6262 6262 6262 6262
0000080 6262 6262 6262 6262 6262 6262 6262 6262
0000090 6262 6262 6262 6262 6262 6262 6262 6262
00000a0 6262 6262 6262 6262 6262 6262 6262 6262
00000b0 000a
00000b1
Então o procedimento seria:
- Leia o dump do arquivo (ou do stdin).
- Para cada asterisco:
- Leia o deslocamento final no início da próxima linha.
- Leia o deslocamento inicial no início da linha anterior.
- Descanse-os para determinar quantas linhas precisam ser inseridas.
- Insira tantas linhas, com o deslocamento aumentando conforme correspondente.
- Envie todo o dump para outro arquivo ou stdout.
Responder1
Tentar
awk '
/^\*/ {GAP = 1 # check if action needed
next # don''t print, proceed to next line
}
GAP {TGT = sprintf ("%d", "0x" $1) + 0 # if action, calculate the end target
do {printf "%07x %s\n", L1, L0 # loop printing identical lines
L1 += 16 # increment the first field
}
while (TGT > L1) # until target reached
GAP = 0 # reset action flag
}
{L1 = sprintf ("%d", "0x" $1) + 16 # save "to come" first field
L0 = $0 # and rest of line
sub ("^" $1 FS, _, L0)
}
1 # print input line
' file2
0000000 6161 6161 6161 6161 6161 6161 6161 6161
0000010 6161 6161 6161 6161 6161 6161 6161 6161
0000020 6161 6261 6262 6262 6262 6262 6262 6262
0000030 6262 6262 6262 6262 6262 6262 6262 6262
0000040 6262 6262 6262 6262 6262 6262 6262 6262
0000050 6262 6262 6262 6262 6262 6262 6262 6262
0000060 6262 6262 6262 6262 6262 6262 6262 6262
0000070 6262 6262 6262 6262 6262 6262 6262 6262
0000080 6262 6262 6262 6262 6262 6262 6262 6262
0000090 6262 6262 6262 6262 6262 6262 6262 6262
00000a0 6262 6262 6262 6262 6262 6262 6262 6262
00000b0 000a
00000b1
Responder2
@RudiC Muito obrigado. Seu script funciona com awk
( original-awk
) e mawk
, mas não com gawk
. Verifique previamente qual é o desenvolvedor e de quem é a versão. Você também pode usar namei /usr/bin/awk
. Certas distribuições Linux/*BSD podem incluir qualquer versão e ser um link simbólico para qualquer outra.
Muitas vezes, 'awk' é apenas um link simbólico para gawk, original-awk ou mawk.
hexdump.exe random.dat | gawk '
/^\*/ {GAP = 1 # check if action needed
next # don''t print, proceed to next line
}
GAP {TGT = sprintf ("%d", "0x" $1) + 0 # if action, calculate the end target
do {printf "%07x %s\n", L1, L0 # loop printing identical lines
L1 += 16 # increment the first field
}
while (TGT > L1) # until target reached
GAP = 0 # reset action flag
}
{L1 = sprintf ("%d", "0x" $1) + 16 # save "to come" first field
L0 = $0 # and rest of line
sub ("^" $1 FS, _, L0)
}
1 # print input line
'
0000000 6161 6161 6161 6161 6161 6161 6161 6161
0000010 6161 6161 6161 6161 6161 6161 6161 6161
0000020 6161 6261 6262 6262 6262 6262 6262 6262
0000030 6262 6262 6262 6262 6262 6262 6262 6262
0000010 6262 6262 6262 6262 6262 6262 6262 6262
00000b0
hexdump.exe data2.dat | gawk '
> /^\*/ {GAP = 1 # check if action needed
> next # don''t print, proceed to next line
> }
> GAP {TGT = sprintf ("%d", "0x" $1) + 0 # if action, calculate the end target
> do {printf "%07x %s\n", L1, L0 # loop printing identical lines
> L1 += 16 # increment the first field
> }
> while (TGT > L1) # until target reached
> GAP = 0 # reset action flag
> }
> {L1 = sprintf ("%d", "0x" $1) + 16 # save "to come" first field
> L0 = $0 # and rest of line
> sub ("^" $1 FS, _, L0)
> }
> 1 # print input line
> '
0000000 6161 6161 6161 6161 6161 6161 6161 6161
0000010 6161 6161 6161 6161 6161 6161 6161 6161
0000020 6161 6261 6262 6262 6262 6262 6262 6262
0000030 6262 6262 6262 6262 6262 6262 6262 6262
0000010 6262 6262 6262 6262 6262 6262 6262 6262
00000b0 000a
00000b1