文件存取
虽说可以通过awk参数指定要处理的文件,可通过代码的形式来动态读取处理文件可以获取更好的灵活性,如:
A,1000,1/3###B,23,2/3,middle###C,782,3/3
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/3filed[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",用于关闭多线程时的管道