2016-04-03 63 views
0

我想通过u_test字符串旁边的字段,其中FS为,,并且还不是以#开头的系统命令(在本例中为grep),以查找包含FS top.v文件中的字符串。使用在awk命令中获得的字段grep

BEGIN{FS=","} 

{ 
    if($0 !~ /^#/){ 
     for(i=1;i<=NF;i++){ 
      if($i ~ /u_test/){ 
       a=$(i+1); 
       cmd = "grep '\$(i+1)' top.v"; 
       printf("%s\n",a); 
       system(cmd); 
      } 
     } 
    } 
} 

上面的代码似乎不起作用。

+0

你能举一个例子输入以及你努力实现的事情的描述(即示例输出)? – Derlin

+0

假设这个脚本的输入包含记录为u_test,abcd,pqrs,wyxc ...我想提取'abcd',它紧挨着u_test字段,并且grep这个字符串在另一个文件中top.v –

+1

您需要向我们展示*确切*输入和*精确*预期输出。请[编辑]您的问题以更新它与这些细节。 – tripleee

回答

0

问题来自您构建cmd字符串的方式。事实上:

cmd = "grep '\$(i+1)' top.v"; 
print cmd; 

给你grep '$(i+1)' top.v,因此\$被视为一个普通的$而不是由awk的变量替换。

所以,相反,使用方法:

cmd = "grep '"$(i+1)"' top.v"; 

或者干脆:

cmd = "grep '"a"' top.v"; 

另外,我建议你使用一个真正的AWK条件,而不是if

$0 !~ /^\#/ { # replaces the if 
    # your code with the for loop 
} 

为了它的乐趣,她e是使用sedxargs做一个班轮相同:

cat ex.txt | sed 's/^#.*//' | sed -n 's/.*u_test,\([^,]*\).*$/\1/p' | xargs -I{} grep {} top.v