这是您正在寻找的语法:
awk '
function testfunc(fileN, my_year, cmd)
{ cmd = "grep \"key_word\" " fileN
cmd | getline my_year
close(cmd)
return(my_year)
}
BEGIN {OFS="\t"}
{printf "%s\t%s\t%s\t", $8, testfunc($8), $9}'
但正如我在评论中提到的 - 不要这样做,无论你试图做什么,这都是错误的方法。
请注意,您不能在单引号分隔的脚本中使用单引号。
编辑:让我试着澄清我关于使用不同方法的观点。您似乎有一个文件,我们称它为“file1”,它的第 8 个字段中有另一个文件名,而您关心的第 9 个字段中有一些其他值。在第 8 个字段中命名的所有文件每个都包含一个包含文本“key_word”的行,您要打印的是 file1 中的第 8 个字段,然后是选项卡,然后是命名文件中的关键字行,然后是第 9 个字段从文件 1。
这可以写成(只是一种可能的解决方案):
gawk -v OFS='\t' '
ARGIND < ARGC { if (/key_word/) my_year[FILENAME] = $0; nextfile }
{ print $8, my_year[$8], $9 }
' $(awk '{print $8}' file1 | sort -u) file1
即在“file1”上调用一次 awk 以获取包含所需日期信息的文件列表,然后将该文件列表在“file1”之前再次传递给 awk,以便最终处理 file1 时所需的所有信息都存储在大批。
上面使用 GNU awk 的“nextfile”来提高效率,但这不是必需的,GNU awks ARGIND 是为了清楚起见,但您可以在非 gawk 解决方案中将 ARGIND < ARGC 替换为 FILENAME!=ARGV[ARGC] 。
有许多替代解决方案,这完全取决于您真正想要做什么......