0

我想将参数 $8(文件名)传递给函数“testfunc”。该函数应该在该文件中 grep 一个 key_word 并返回一个年份。问题是 Linux 命令“grep”在 fileN 中看不到任何内容。如果我直接通过 $8,它仍然什么也看不到。

awk '
   function testfunc(fileN, my_year)
     { "grep 'key_word' fileN"  | getline my_year
       return(my_year)
       close("grep 'key_word' fileN")
     }
   BEGIN {OFS="\t"}
         {printf "%s\t%s\t%s\t", $8, testfunc($8), $9}'
4

3 回答 3

1

试试这个:

function testfunc(fileN)
     { 
       cmd="grep 'key_word' " fileN 
       cmd | getline my_year
       return(sprintf("%s",my_year))
     }
于 2013-03-05T20:20:39.723 回答
1

这是您正在寻找的语法:

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] 。

有许多替代解决方案,这完全取决于您真正想要做什么......

于 2013-03-06T00:10:56.700 回答
0

感谢 Ed 和 Zsolt 的帮助。最后,我决定改用 shell 脚本,因为除了grep命令之外,我还需要一个sed命令,因为它需要特殊的字符,所以会出现各种问题。所以我的最终解决方案如下:

fileList=`ls -1 *.xml`
for f in ${fileList} ; do
   my_year=`grep -e "key_word"  ${f} | sed -n '{s/^.*>\([0-9][0-9]*\)<.*$/\1/p}'`
   line=`ls -ltr ${f}`
   line="${line} ${my-year} sthElseHere"
   echo ${line}
done | \

awk ' BEGIN {print "File Name              \tcol02 \tcol03 "
             print "===================    \t====== \t============"}
            {printf "%s\t%s\t%s\n", $8, $4, $9  }'
于 2013-03-06T16:06:19.827 回答