我是AWK的新手,我正在尝试用逗号分隔的文件创建一个C风格的数组。这是输入文件EE.hex。长度(如果此文件可能不同,则为十六进制数的数量):
0x01 , 0x00 , 0x05 , 0x00 , 0x08 , 0x1C , 0x00 , 0x58 ,
0x03 , 0x03 , 0x03 , 0x03 , 0x03 , 0x03 , 0x03 , 0x03 ,
0x03 , 0x03 , 0x03 , 0x03 , 0x03 , 0x03 , 0x03 , 0x03 ,
0x03 , 0x03 , 0x01 , 0x00 , 0x23 , 0x00 , 0x08 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x01 , 0x00 , 0x5B , 0x00 , 0x00 , 0x00 , 0x00 , 0x80 ,
这是我一直在研究的AWK脚本(EE.sh):
#!/bin/bash
EEPROM_FILE="$1" # First parameter - DSP parameter file
awk '
BEGIN {
printf("const uint8_t DSP_eeprom[] =\n{\n")
array_size=0
}
{
# Format hex EEPROM array properly
if ($1 ~ "0x.")
{print " " $1 $2, $3 $4, $5 $6, $7 $8 "\n " $9 $10, $11 $12, $13 $14, $15 $16}
# Count how many bytes there is in the array were creating
for(i=1; i < NF; i++) {
if ($i ~ "0x.") {
array_size++
}
}
}
END {
printf("};\n")
{print "//I want the calculated array size "array_size" to be inserted between the [] brackets, not at the end like this!"}
}' "$EEPROM_FILE" > EE.h
输出文件(EE.h)如下所示:
const uint8_t DSP_eeprom[] =
{
0x01, 0x00, 0x05, 0x00,
0x08, 0x1C, 0x00, 0x58,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x01, 0x00,
0x23, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x5B, 0x00,
0x00, 0x00, 0x00, 0x80,
};
//I want the calculated array size 72 to be inserted between the [] brackets
正如您在评论中已经看到的那样,我需要在方括号之间放置十六进制数,而不是在末尾。有什么方法可以
A)在方括号之间插入数字?
B)在 {字符?
所需输出如下所示,计算出的长度插入方括号之间:
const uint8_t DSP_eeprom[72] =
{
0x01, 0x00, 0x05, 0x00,
0x08, 0x1C, 0x00, 0x58,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x01, 0x00,
0x23, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x5B, 0x00,
0x00, 0x00, 0x00, 0x80,
};
谢谢!
答案 0 :(得分:1)
如果你有gawk
,你可以简单一点
$ awk -F' *, *' -v RS='^$' -v OFS=', ' '
{print "const uint8_t DSP_eeprom[" NF-1 "] =\n{";
for(i=1;i<NF;i++) printf "%s", $i OFS ((i+4)%8?"":ORS)}
END {print "\n};" }' file
const uint8_t DSP_eeprom[72] =
{
0x01, 0x00, 0x05, 0x00,
0x08, 0x1C, 0x00, 0x58,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x01, 0x00,
0x23, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x5B, 0x00,
0x00, 0x00, 0x00, 0x80,
};