之前一篇博客提到了在 Hadoop 程序中如何获取 input split 所在的文件名。其实,写 Awk 程序时,也可能有同样的需求。那么,Awk 是如何处理的呢?
Awk 提供了一个内置变量 FILENAME
,表示被读取文件的绝对路径。
闲话少说,直接上示例代码:
cat /dev/null > /tmp/beta4x && cat /tmp/beta4x | awk '{print FILENAME}' # 输出为空 cat /dev/null > /tmp/beta4x && awk '{print FILENAME}' /tmp/beta4x # 输出为空 echo "hello" > /tmp/beta4x && cat /tmp/beta4x | awk '{print FILENAME}' # 输出为 - echo "hello" > /tmp/beta4x && awk '{print FILENAME}' /tmp/beta4x # 输出为 /tmp/beta4x
可以看出,Awk 的输入内容与 FILENAME
变量之间的关系:
- 输入内容为空,FILENAME 值为空
- 输入内容非空、来自 stdin,FILENAME 值为 –
- 输入内容非空、来自文件,FILENAME 值为文件名
PS. 我这里测试用的 Awk 版本是 GNU Awk 4.0.2。