首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将参数传递给AWK中处理的每一行的命令

如何将参数传递给AWK中处理的每一行的命令
EN

Stack Overflow用户
提问于 2013-03-06 04:05:57
回答 3查看 395关注 0票数 0

我想把参数$8传递给函数"testfunc“,它是一个文件名。该函数应在该文件中grep一个key_word并返回一年。问题是Linux命令"grep“在fileN中看不到任何东西。如果我直接传递$8,它仍然看不到任何东西。

代码语言:javascript
复制
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}'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-06 08:10:57

这是您要查找的语法:

代码语言:javascript
复制
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个字段,然后是一个制表符,然后是来自已命名文件的关键字行,然后是来自file1的第9个字段。

这可以写成(只有一种可能的解决方案):

代码语言:javascript
复制
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!=ARGVARGC。

有很多不同的解决方案,这完全取决于你真正想要做的是什么……

票数 1
EN

Stack Overflow用户

发布于 2013-03-06 04:20:40

试试这个:

代码语言:javascript
复制
function testfunc(fileN)
     { 
       cmd="grep 'key_word' " fileN 
       cmd | getline my_year
       return(sprintf("%s",my_year))
     }
票数 1
EN

Stack Overflow用户

发布于 2013-03-07 00:06:20

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

代码语言:javascript
复制
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  }'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15233088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档