Angenommen, ich habe zwei Hexdumps generiert, die das Asterisk enthalten. Erste Datei ( xxd -r
funktioniert):
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
Zweite Datei ( xxd -r
funktioniert nicht):
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
Ich möchte den Original-Dump ohne Komprimierung und ohne die Originaldatei zu haben generieren können. Genau so:
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
Das Vorgehen wäre also:
- Dump aus Datei lesen (oder von stdin).
- Für jedes Sternchen:
- Lesen Sie den End-Offset am Anfang der nächsten Zeile.
- Lesen Sie den Start-Offset am Anfang der vorherigen Zeile.
- Lassen Sie sie ruhen, um zu bestimmen, wie viele Zeilen eingefügt werden müssen.
- Fügen Sie entsprechend viele Zeilen ein, wobei der Versatz entsprechend zunimmt.
- Geben Sie den gesamten Dump in eine andere Datei oder auf Standardausgabe aus.
Antwort1
Versuchen
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
Antwort2
@RudiC Vielen Dank. Ihr Skript funktioniert mit awk
( original-awk
) und mawk
, aber nicht mit gawk
. Prüfen Sie vorher, wer der Entwickler ist und wessen Version es ist. Sie können auch verwenden namei /usr/bin/awk
. Bestimmte Linux-Distributionen / *BSD können jede Version davon enthalten und ein symbolischer Link zu jeder anderen sein.
Oft ist „awk“ lediglich ein symbolischer Link zu gawk, original-awk oder 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