我想将参数$ 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}'
答案 0 :(得分:1)
试试这个:
function testfunc(fileN)
{
cmd="grep 'key_word' " fileN
cmd | getline my_year
return(sprintf("%s",my_year))
}
答案 1 :(得分: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个字段来自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
即。在“file1”上调用awk一次以获取包含所需日期信息的文件列表,然后在“file1”之前将该文件列表再次传递给awk,以便最终处理file1时所需的所有信息都存储在数组中
上面使用GNU awk的“nextfile”来提高效率,但这并不是必需的,为了清楚起见,GNU要求ARGIND,但你可以替换ARGIND&lt; ARGC与FILENAME!= ARGV [ARGC]在一个非gawk解决方案。
有许多替代解决方案,这完全取决于你真正想做的事情....
答案 2 :(得分: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 }'