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
clx
March 8, 2011, 10:37pm
3
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***********
rdcwayx:
for (i=0;i<=66535;i++)
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:
yinyuemi:
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
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,
yinyuemi:
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