這是你要找的語法:
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個字段來自file1。
這可以寫成(只有一個可能的解決方案):
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
即調用AWK一次在「文件1」中獲得包含要那麼最新信息的文件列表傳遞文件,這些文件列表在「file1」之前再次awk,這樣在最終處理file1時需要的所有信息都會存儲在數組中。
以上使用GNU awk的「下一文件」的效率,但是這不是必需的,GNU awks ARGIND爲清晰起見,但你可以用文件名代替ARGIND < ARGC!= ARGV [ARGC]在非GAWK解決方案。
還有許多其他的解決方案,這一切都取決於你真正想要做....
這絕對是錯誤的做法。您試圖將awk用作shell - 不這樣做,即使您可以強制執行它並生成所需的輸出,awk也不是很好。驚喜,驚喜,外殼非常擅長。如果你告訴我們你真的想要做什麼,我們可以提供幫助。 – 2013-03-05 20:43:43