如何从 awk 中捕获文件?

如何从 awk 中捕获文件?
END {
file = "a.txt"
system(cat file)
}

我想做这样的事情吗? (打开一个名称位于 awk 变量中的文件)。它是如何完成的?

答案1

获取线 是你的朋友:

awk 'BEGIN{file="a.txt";while ((getline<file) > 0) {print}}'

答案2

问题是 system() 将命令行传递给 shell,因此在一般情况下,您需要转义文件名中的所有 shell 特殊字符。

awk 有一个 ENVIRON 关联数组,它映射到它收到的环境,但不幸的是,分配给它不会影响通过system或执行的命令的环境getline

awk -v q="'" '
   function escape(str) {
     gsub(q, q "\\" q q, str)
     return q str q
   }
   BEGIN {
     file = "a.txt"
     system("cat " escape(file))
   }'

当然,如果文件是“a.txt”或者您可以确保其路径永远不会包含任何 shell 特殊字符,您可以摆脱:

system("cat " file)

如果您可以确保它不包含单引号字符,您可以这样做:

system("cat '\''" file "'\''")

答案3

如果您打算定义应在 awk 脚本本身中处理的文件,则可以相应地更改 ARGV 数组和 ARGC 变量:

awk 'BEGIN{ ARGV[ARGC] = "your_file.txt" ; ARGC++} {print}'

相关内容