GNU AWK中BEGIN/END使用举例

        以下是使用gnu awk将test.cpp文件拆分成两个文件a.cpp和b.cpp,其中b.cpp仅存放test.cpp中的数据,其它内容存放在a.cpp文件中。

        test.cpp内容如下:

#include <stdio.h>
#include <iostream>
#include <string>

int main()
{
    // face size: [20, 30, 200, 400](x, y, width, height), detection time in 50 ms.
    // eye size: [5, 5, 10, 10](x, y, width, height), detection time in 10 ms.

    const std::string blog_name = "https://blog.csdn.net/fengbingchun";
    unsigned char t = 4;
    
    const unsigned char _xx[5] __attribute__((aligned(64))) = { 
        0x02, 0x32, 0x42, 0x32, 0x69 
    };

    typedef struct {
        int x, y, width, height;
        float score;
    } rect;

    const unsigned char _yy[7]  __attribute__((aligned(64))) = {
        0x12, 0x23, 0x54, 0x89,
        0x01, 0x09, 0x26
    };

    const std::string github_name = "https://github.com/fengbingchun";

    const unsigned char _zz[3] __attribute__((aligned(64))) = {
        0x23, 0x78, 0x15
    };

    fprintf(stdout, "ok\n");

    return 0;
}

        test.awk内容如下:

#! /bin/bash/awk

BEGIN {
    # 在BEGIN中FILENAME不起作用
    print "// ===== start process file: " ARGV[1]
    # author为外部传进来的变量名
    print "// Author: " author

    state = 0
    offset = 0
}

{
    if (match($0, "blog_name .* \"(.*)\"", s)) {
        blog = s[1]
    }

    if (match($0, "github_name .* \"(.*)\"", s)) {
        github = s[1]
    }

    if (FNR == 1) {
        print "// file name: " file1 > file1
        print "// Author: " author >> file1
        print "// ===== start process file: " FILENAME >> file1
        print "" >> file1
        print "// file name: " file2 > file2
        print "// Author: " author >> file2
        print "// ===== start process file: " FILENAME >> file2
        print "" >> file2
        print "unsigned char data[] = { " >> file2
    }

    if (state == 0 && $0 ~ "^    const unsigned char") {
        state = 1
        pos0 = index($0, "_")
        pos1 = index($0, "[")
        pos2 = index($0, "]")
        name = substr($0, pos0, pos1 - pos0)
        offsetstr = substr($0, pos1 + 1, pos2 - pos1 - 1)
        offsetl = 0 + offsetstr

        if (offsetl % 64 != 0) {
            remain = 64 - offsetl % 64
        } else {
            remain = 0
        }

        print "    const unsigned char* "name" = NULL;" >> file1
        print "    const unsigned int "name"_offset = " offset ";" >> file1
        offset += (offsetl + remain);
        print "// start data: " name >> file2

    } else if (state == 1) {
        if ($0 ~ "^    };") {
            print "// end data: " name >> file2;
            print "," >> file2
            print "// "name" remain: " remain >> file2;
            for (i = 0; i < remain; ++i) {
                printf("0x00, ") >> file2;
            }
            print "" >> file2
            state = 0;
        } else {
            print $0 >> file2
        }
    } else {
        print $0 >> file1
    }
}

END {
    printf "};\n\n" >> file2
    print "// blog: "blog" " >> file1
    print "// github: "github" " >> file2
    print "// ===== end process file: " FILENAME
    print "// ===== end process file: " FILENAME >> file1
    print "// ===== end process file: " FILENAME >> file2
}

        在mark.sh文件中添加一句:

awk -f test.awk -v author="fengbingchun"  -v file1="a.cpp" -v file2="b.cpp" test.cpp

        执行mark.sh:$ ./mark.sh

        自动生成的a.cpp文件如下:

// file name: a.cpp
// Author: fengbingchun
// ===== start process file: test.cpp

#include <stdio.h>
#include <iostream>
#include <string>

int main()
{
    // face size: [20, 30, 200, 400](x, y, width, height), detection time in 50 ms.
    // eye size: [5, 5, 10, 10](x, y, width, height), detection time in 10 ms.

    const std::string blog_name = "https://blog.csdn.net/fengbingchun";
    unsigned char t = 4;
    
    const unsigned char* _xx = NULL;
    const unsigned int _xx_offset = 0;

    typedef struct {
        int x, y, width, height;
        float score;
    } rect;

    const unsigned char* _yy = NULL;
    const unsigned int _yy_offset = 64;

    const std::string github_name = "https://github.com/fengbingchun";

    const unsigned char* _zz = NULL;
    const unsigned int _zz_offset = 128;

    fprintf(stdout, "ok\n");

    return 0;
}


// blog: https://blog.csdn.net/fengbingchun 
// ===== end process file: test.cpp

        自动生成的b.cpp文件内容如下:

// file name: b.cpp
// Author: fengbingchun
// ===== start process file: test.cpp

unsigned char data[] = { 
// start data: _xx
        0x02, 0x32, 0x42, 0x32, 0x69 
// end data: _xx
,
// _xx remain: 59
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, 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, 
// start data: _yy
        0x12, 0x23, 0x54, 0x89,
        0x01, 0x09, 0x26
// end data: _yy
,
// _yy remain: 57
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
// start data: _zz
        0x23, 0x78, 0x15
// end data: _zz
,
// _zz remain: 61
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, 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, 
};

// github: https://github.com/fengbingchun 
// ===== end process file: test.cpp
        GitHubhttps://github.com/fengbingchun/Linux_Code_Test  

猜你喜欢

转载自blog.csdn.net/fengbingchun/article/details/80958561
GNU