アスタリスクを含む 2 つの 16 進ダンプを生成したとします。最初のファイル (xxd -r
動作 ):
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
2 番目のファイル (xxd -r
動作しません):
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
圧縮せずに、元のファイルなしで元のダンプを生成できるようにしたいと思います。まさに次のようになります。
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
手順は次のようになります。
- ファイルから(または標準入力から)ダンプを読み取ります。
- 各アスタリスクについて:
- 次の行の先頭の終了オフセットを読み取ります。
- 前の行の先頭から開始オフセットを読み取ります。
- 挿入する必要がある行数を決定するために休憩を取ってください。
- 対応するオフセットを増やしながら、その数の行を挿入します。
- ダンプ全体を別のファイルまたは標準出力に出力します。
答え1
試す
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
答え2
@RudiC ありがとうございます。あなたのスクリプトはawk
( original-awk
)と では動作しますmawk
が、 では動作しませんgawk
。どちらが開発者で、誰のバージョンであるかを事前に確認してください。 も使用できますnamei /usr/bin/awk
。特定の Linux ディストリビューション / *BSD には の任意のバージョンが含まれており、他のバージョンへのシンボリックリンクになっている場合があります。
多くの場合、「awk」は gawk、original-awk、または 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