在Tcl foreach循环中的awk命令

时间:2017-02-28 05:46:21

标签: loops awk tcl

我需要将一个变量值传递给tickle中使用的awk命令。 目标:我想在循环中逐个提取文件clk_gate_names的fisrt字段。所以这是一个小例子,显示在一个脚本中使用了相同的概念。

以下一个测试用例:

set a 0
incr a
foreach i {0.. 11} { # i variable is used for another thing
set test [exec awk {NR==${a}{print $1}} clk_gate_names]
}

获得以下错误: awk:NR == $ {a} {print $ 1} awk:^语法错误

请在这里说清楚。在此先感谢:)

3 个答案:

答案 0 :(得分:2)

问题是你想要混合来自Tcl的变量和来自Awk的变量。这有点复杂,因为它们必然是单独的进程。

一种选择是使用Tcl的format命令来构建Awk脚本 - 。

set a 0
incr a
foreach i {0.. 11} { # i variable is used for another thing
    set awkcode [format {NR==%d {print $1}} $a]
    set test [exec awk $awkcode clk_gate_names]
}

但是,更好的方法是通过-v选项传递变量。这样做的好处是不会被任何奇怪的引用搞错,并且Tcl不会意外地破坏单词(除了在exec中,当它看起来像文件/管道重定向时;这是一个疣)。 / p>

set a 0
incr a
foreach i {0.. 11} { # i variable is used for another thing
    set test [exec awk -v a=$a {NR==a {print $1}} clk_gate_names]
}

第三种方式是use an environment variable。这样做的好处是不易受重定向问题的影响(因此您可以传入包含>的值)。

set a 0
incr a
foreach i {0.. 11} { # i variable is used for another thing
    set env(A_FROM_TCL) $a
    set test [exec awk {NR==$ENVIRON["A_FROM_TCL"] {print $1}} clk_gate_names]
}

备注:

  1. 请记住使用awk和Tcl,不要使用单引号。 Tcl不使用与bash相同的语法。总是将脚本放在括号中,否则你会非常困惑。
  2. 我假设你知道foreach的语法?出于我们在这里讨论的目的,它并不重要,但如果您发布的代码正好您正在使用的内容,那么您可能会遇到问题...

答案 1 :(得分:0)

尝试以下逻辑 -

awk -v a=1 'NR==a {print $1}' f

根据您的代码 -

set a 0
incr a
foreach i {0.. 11} { # i variable is used for another thing
set test [exec awk -v a="$a" 'NR==a {print $1}' clk_gate_names]
}

让我知道它是否满足您的要求。并共享输出(所需的输出/错误)

答案 2 :(得分:0)

awk -v a=${a} "NR==a{print \$1}" filename

检查:

http://phaseit.net/claird/comp.lang.tcl/fmm.html

  
    

AWK:谁是谁awk'{print $ 1}'可以从命令行工作,但我的Tcl解释器拒绝exec谁| awk'{print $ 1}'我经常听到     来自尚未学会要求tclsh解释的人     执行谁| awk {{print $ 1}}请注意'-s不是'关于'awk;     它们只是壳中最常见的引用     经常访问awk。 exec不使用shell。 {}表演     引用Tcl的类似函数。更多的例子出现在这里     谷歌线程。 Alexandre Ferrieux给出了正确而简洁的说法     在另一个线程中解释。他遇到的问题恰巧发生了     做sed,但这基本上是无关紧要的;命令行     awk和sed的语法表现出相同的症状。简而言之,作为     自己出现的错误消息说,单引号(')是     问题。这些是字符串的shell标记,不应该是     取代。 / bin / sh和其他人在调用awk之前删除了这个标记。

  
     

相反,在Tcl中,大括号{}起着同样的作用。大括号有   它们可以嵌套的优点。一个结论:支撑牙箍   awk期望:awk -F“”{{print $ 1}}。请注意,在这最后,它   没有必要逃脱美元符号,因为外支撑   保护它。

     

Richard Suchenwirth多次写过,   Mark Janssen,Kevin Kenny和其他人;这不太可能   表达是孤立发明的。