之前一篇博客提到了在 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。

Leave a Reply

Your email address will not be published. Required fields are marked *