AWK:在输出文件的中间附加文本

时间:2018-03-19 18:13:33

标签: awk hex

我是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,
};

谢谢!

1 个答案:

答案 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,
};