文件存取

虽说可以通过awk参数指定要处理的文件,可通过代码的形式来动态读取处理文件可以获取更好的灵活性,如:

chapter_5_1-1.data

A,1000,1/3###B,23,2/3,middle###C,782,3/3

chapter_5_1-1.awk

BEGIN{
    # 设置记录分隔符
    RS = "###";
    # 设置域分隔符
    FS = ",";
    # 逐行读取文件
    while( getline0 ) {
            print("line: "$0);
            print("filed[1]: "$1);
    }
}
{
}
END{
}

$echo ""|awk -v filePath="./chapter_5_1-1.data" -f chapter_5_1-1.awk
line: A,1000,1/3
filed[1]: A
line: B,23,2/3,middle
filed[1]: B
line: C,782,3/3

filed[1]: C

通过getline可以对指定文件进行逐行处理,也可以在程序代码中动态的指定记录分隔符和域分隔符,上方例程中while()内部循环的处理就类似于awk程序框架的body部分。

写入文件

统计计算很重要的一个环节就是结果的保存,通过awk写入本地文件系统,只需要使用重定向符号即可轻松完成这项工作,参考例程: chapter_5_1-2.awk

BEGIN{
    logFile = "/tmp/test/log.txt";
    rollingFile = "/tmp/test/rolling.txt";

    # 创建或是清空原有文件进行写入
    print("第一行") > logFile;
    # 继续写入一行
    print("第二行") > logFile;
    # 修改行分隔符 
    ORS = "@@@";
    print("第三行") > logFile;
    print("第四行") >> logFile;
    ORS = "\n";
    print("第五行") > logFile;
    print("第六行") > logFile;

    # 以内容添加形式打开文件并写入
    print("10") >> rollingFile;
    print("20") >rollingFile;

    # 把缓存都刷入文件
    fflush(logFile);
    fflush(rollingFile);

    # 关闭文件
    close(logFile);
    close(rollingFile);
}
{
}
END{
}

$echo ""|awk -f chapter_5_1-2.awk
cat log.txt
第一行
第二行
第三行@@@第四行@@@第五行
第六行
$cat rolling.txt
10
20
10
20

连续运行2遍程序并查看输出文件,可以看到,决定文件是清空写入还是追加写入的是程序中首次发生写入的地方,使用>就是新建或清空文件并写入,使用>>就是新建或打开文件在结尾写入。
其中的fflush()用于将写入缓存中的数据强行写入文件(如果写入数据未达到写入块的大小不会立即写入文件),close()用于关闭文件句柄,函数原型如下:

fflush([file])
file 要强制写入的文件,缺省情况下是标准输出,null的情况下对所有打开文件进行强制刷入

close(file [, how])
file 指定要关闭的文件 how 可选参数,取值为"to"或"from",用于关闭多线程时的管道

results matching ""

    No results matching ""