文件存取
虽说可以通过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",用于关闭多线程时的管道