help with file processing

Hi ,

I have a memory file like this with two columns:

@C010   AA
@C011   AA
@C012   FE
@C013   FF
@C014   F7
@C015   FF

first is memory add, second is the data.
I wan to convert into a serial sequence starting from '00000' all the way to 'FFFFF' with those fields from the above file filled in. The rest will be filled with '00'.
Any help would be greatly appreciated.

Best Regards.

Please show us an example of what the output is like?

1 Like

What should be the output of the above sample?

awk -F"[@ ]" '{a[$2]=$3}END{for (i=0;i<=66535;i++) {t=sprintf ("%04X",i);print "@" t,(t in a)? a[t]:"00"}}' infile

....
@C007 00
@C008 00
@C009 00
@C00A 00
@C00B 00
@C00C 00
@C00D 00
@C00E 00
@C00F 00
@C010 AA
@C011 AA
@C012 FE
@C013 FF
@C014 F7
@C015 FF
@C016 00
@C017 00
@C018 00
@C019 00
....

Thanks for all your replies. Sorry forgot to provide the output format.

Address should start from '00000' and go to 'FFFFF' in the first column and grab the values from the input file for the data. For the missing address/data in the input file it should put a '00' in the data field.

Example input:
********begin*****

C010   AA
C011   AA
C012   FE
C013   FF
C014   F7
C015   FF

********end*********
Example output:
*************begin***********

00000 00
00001 00
00002 00
...
...
0C009 00
0C010 AA
0C011 AA
0C012 FE
0C013 FF
0C014 F7
0C015 FF
0C016 00
..
..
FFFFE 00
FFFFF 00

*************end***********

Assuming that's intended to be the decimal equivalent of the 0x0000-0xFFFF range, there's a typo in the upper value. It should be 65535 instead of 66535.

However, I believe the original problem spans up to 0xFFFFF, 2^20-1, 1048575.

Regards,
Alister

Thanks for the help but this:

 
awk -F"[@ ]" '{a[$2]=$3}END{for (i=0;i<=66535;i++) {t=sprintf ("%04X",i);print "@" t,(t in a)? a[t]:"00"}}' infile

actually replaced all the second columns in my output files with '00' instead of the values from my input file.

Please help.
Thank you.

Here's one way to do it with Perl -

$
$
$ # display the input file
$
$ cat input
@C010   AA
@C011   AA
@C012   FE
@C013   FF
@C014   F7
@C015   FF
$
$
$ # run the Perl one-liner to process input file
$
$ perl -lane 's/^@//; $x{$F[0]} = $F[1];
             END {
               printf("@%04X %02s\n", $_, $x{sprintf("@%X",$_)} // "00") for (0xC000..0xC020)
             }' input
@C000 00
@C001 00
@C002 00
@C003 00
@C004 00
@C005 00
@C006 00
@C007 00
@C008 00
@C009 00
@C00A 00
@C00B 00
@C00C 00
@C00D 00
@C00E 00
@C00F 00
@C010 AA
@C011 AA
@C012 FE
@C013 FF
@C014 F7
@C015 FF
@C016 00
@C017 00
@C018 00
@C019 00
@C01A 00
@C01B 00
@C01C 00
@C01D 00
@C01E 00
@C01F 00
@C020 00
$
$
$

For your case, the following range of values -

(0xC000..0xC020)

should be changed to this -

(0x0000..0xFFFF)

HTH,
tyler_durden

1 Like

Hi tyler_durden ,

Thank you so much for the help, but could you please let me know how to run this? Here's what I did:

256 SRC > perl -lane 's/^@//; $x{$F[0]} = $F[1]; END { printf("@%04X %02s\n", $_, $x{sprintf("@%X",$_)} // "00") for (0x0000..0xFFFF)}' cpu_v3_iwew.ver.org_new > good_file
Search pattern not terminated at -e line 1.
257 SRC > 
257 SRC > 
257 SRC > 
257 SRC > perl -lane 's/^@//; $x{$F[0]} = $F[1]; END { printf("@%04X %02s\n", $_, $x{sprintf("@%X",$_)} }' cpu_v3_iwew.ver.org_new > good_file  syntax error at -e line 1, near "} }"
Execution of -e aborted due to compilation errors.
258 SRC > 

Could you please let me know how to make it into a perl file and use it to other input? Greatly appreciate your help.
Thank you,

---------- Post updated at 01:23 PM ---------- Previous update was at 12:52 PM ----------

Hi,
I tried this:

264 SRC > perl -lane 's/^@//; $x{$F[0]} = $F[1]; END { printf("@%05X %02s\n", $_, $x{sprintf("@%X",$_)} // "00") for (0x00000..0xFFFFF)}' input_file
Search pattern not terminated at -e line 1.
265 SRC > 
265 SRC > 
265 SRC > 
265 SRC > cat input_file 
@E0000  7E
@E0001  8F
@E0002  40
@E0003  00
@E0004  7E
@E0005  9F
@E0006  50
@E0007  00
@E0008  7E
@E0009  9F
266 SRC > 

Pleas help me what is wrong?
Thank you.

---------- Post updated at 02:09 PM ---------- Previous update was at 01:23 PM ----------

[code]
Example Input:

C010 AA
C011 AA
C012 FE
C013 FF
C014 F7
C015 FF

Example output:

00000 00
00001 00
00002 00
...
...
0C009 00
0C010 AA
0C011 AA
0C012 FE
0C013 FF
0C014 F7
0C015 FF
0C016 00
..
..
FFFFE 00
FFFFF 00

[\code]

What version of Perl are you working with?

tyler_durden

273 SRC > perl -ver

This is perl, v5.8.8 built for x86_64-linux-thread-multi

Copyright 1987-2006, Larry Wall

try:

awk '{a["0"$1]=$2}END{for(i=1;i<=strtonum("0xFFFFF");i++) {a1=sprintf ("%X",i);a2=sprintf("%0"5-length(al)"s",a1);printf("%s\t%s\n",a2,a3=(a2 in a)?a[a2]:"00")}}' input 

Hi,
Thank you for the suggestion:

I tried this and it still doesn't seem to work, my 'known' data from input file is also all '00'.

13 SRC > 
13 SRC > cat ttt 
00000  7E
00001  8F
00002  40
00003  00
00004  7E
00005  9F
00006  50
14 SRC > awk '{a["0"$1]=$2}END{for(i=1;i<=strtonum("0xFFFFF");i++) {a1=sprintf ("%X",i);a2=sprintf("%0"5-length(al)"s",a1);printf("%s\t%s\n",a2,a3=(a2 in a)?a[a2]:"00")}}' ttt >ttt_out
15 SRC > 
15 SRC > head ttt_out 
00001	00
00002	00
00003	00
00004	00
00005	00
00006	00
00007	00
00008	00
00009	00
0000A	00
16 SRC > 
16 SRC > 

Could you please let me know what I may be doing wrong?

it works on my computer

cat output
.....
0C009   00
0C010   AA
0C011   AA
0C012   FE
0C013   FF
0C014   F7
0C015   FF
0C016   00
0C017   00
0C018   00
.....

Hi guy,

if the first line is the form of "00000" not "0000", which is shown in your example file before, you should change code as following:

 awk '{a[$1]=$2}END{for(i=1;i<=strtonum("0xFFFFF");i++) {a1=sprintf ("%X",i);a2=sprintf("%0"5-length(al)"s",a1);printf("%s\t%s\n",a2,a3=(a2 in a)?a[a2]:"00")}}' ttt |head
00001   8F
00002   40
00003   00
00004   7E
00005   9F
00006   50
00007   00
00008   00
00009   00
0000A   00
'

Best,

Y

1 Like

Try this:

awk '{s=sprintf ("0%s",$1);a=$2}END{for (i=0;i<=1048575;i++) {t=sprintf ("%05X",i);print t,(t in a)? a[t]:"00"}}' infile 

I see someone use strtonum function, that some system's awk don't support it.

1 Like

Thanks! the solution that you suggested worked for me!
Best Regards,
:b: