これはあなたが探している構文です:
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から。
それは次のように書くことができます (考えられる解決策の 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 を 1 回呼び出して、必要な日付情報を含むファイルのリストを取得し、そのファイルのリストを「file1」の前にもう一度 awk に渡すと、最終的に file1 を処理するときに必要なすべての情報がファイルに保存されます。配列。
上記では、効率のために GNU awk の「nextfile」を使用していますが、これは必須ではなく、明確にするために GNU awk ARGIND を使用していますが、非 gawk ソリューションでは ARGIND < ARGC を FILENAME!=ARGV[ARGC] に置き換えることができます。
多くの代替ソリューションがありますが、それはすべて、実際に何をしようとしているかによって異なります....